cli

Command-line interface for Radroots
git clone https://radroots.dev/git/cli.git
Log | Files | Refs | README | LICENSE

commit 4b0039194d188083b9def3473d99d6ab8410e498
parent c96c4805d0577b12c3cb5056d730627759204090
Author: triesap <tyson@radroots.org>
Date:   Tue, 25 Aug 2026 08:15:48 +0000

api: seal the root-only command surface

- hide implementation modules behind explicit crate-root exports
- freeze the exact reviewed public API baseline
- reject dependency leaks and credential-bearing surfaces
- document and verify the standalone boundary gate

Diffstat:
MAGENTS.md | 1+
MREADME | 13++++++++-----
Acontracts/api_baselines/radroots_cli.txt | 319+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Ascripts/verify-boundaries.sh | 23+++++++++++++++++++++++
Msrc/cli/mod.rs | 73+++++++++++++++++++++++++++++++++++++++++++++----------------------------
Msrc/lib.rs | 24+++++++++++++++++++++++-
Msrc/main.rs | 2+-
Atests/package_boundary.rs | 41+++++++++++++++++++++++++++++++++++++++++
8 files changed, 461 insertions(+), 35 deletions(-)

diff --git a/AGENTS.md b/AGENTS.md @@ -107,6 +107,7 @@ cargo check --all-targets --locked cargo test --all-targets --locked cargo clippy --all-targets --locked -- -D warnings RUSTDOCFLAGS="-D warnings" cargo doc --no-deps --locked +scripts/verify-boundaries.sh scripts/verify-supply-chain.sh tools/verify-repository-boundary.sh ``` diff --git a/README b/README @@ -81,15 +81,18 @@ cargo check --all-targets --locked cargo test --all-targets --locked cargo clippy --all-targets --locked -- -D warnings RUSTDOCFLAGS="-D warnings" cargo doc --no-deps --locked +scripts/verify-boundaries.sh scripts/verify-supply-chain.sh tools/verify-repository-boundary.sh ``` -The supply-chain command validates the exact locked dependency graph, license -policy, approved registries and immutable Lib source, then rejects forbidden -capsule-local documentation and workflow roots. An extbuild-enabled checkout -routes these commands through `cargo extbuild run -- ...`. Nix and OCI are -deferred and unclaimed through RCLD-RSHR-170. +The boundary command byte-compares the root-only public API against its +reviewed baseline and rejects forbidden repository roots or credential +material. The supply-chain command validates the exact locked dependency +graph, license policy, approved registries and immutable Lib source, then +rejects forbidden capsule-local documentation and workflow roots. An +extbuild-enabled checkout routes these commands through `cargo extbuild run -- +...`. Nix and OCI are deferred and unclaimed through RCLD-RSHR-170. ## Copyright and license diff --git a/contracts/api_baselines/radroots_cli.txt b/contracts/api_baselines/radroots_cli.txt @@ -0,0 +1,319 @@ +pub mod radroots_cli +pub enum radroots_cli::AccountCommand +pub radroots_cli::AccountCommand::Create +pub radroots_cli::AccountCommand::Import(radroots_cli::AccountImportArgs) +pub radroots_cli::AccountCommand::List +pub radroots_cli::AccountCommand::Remove(radroots_cli::AccountSelectorArgs) +pub radroots_cli::AccountCommand::Select(radroots_cli::AccountSelectorArgs) +pub enum radroots_cli::BasketCommand +pub radroots_cli::BasketCommand::Create(radroots_cli::BasketCreateArgs) +pub radroots_cli::BasketCommand::Get(radroots_cli::BasketKeyArgs) +pub radroots_cli::BasketCommand::Item(radroots_cli::BasketItemArgs) +pub radroots_cli::BasketCommand::List +pub radroots_cli::BasketCommand::Quote(radroots_cli::BasketKeyArgs) +pub enum radroots_cli::BasketItemCommand +pub radroots_cli::BasketItemCommand::Add(radroots_cli::BasketItemMutationArgs) +pub radroots_cli::BasketItemCommand::Remove(radroots_cli::BasketItemRemoveArgs) +pub radroots_cli::BasketItemCommand::Update(radroots_cli::BasketItemMutationArgs) +pub enum radroots_cli::DiagnosticsCommand +pub radroots_cli::DiagnosticsCommand::Inspect +pub enum radroots_cli::FarmCommand +pub radroots_cli::FarmCommand::Create(alloc::boxed::Box<radroots_cli::FarmCreateArgs>) +pub radroots_cli::FarmCommand::Get +pub radroots_cli::FarmCommand::List +pub radroots_cli::FarmCommand::Publish +pub radroots_cli::FarmCommand::Update(radroots_cli::FarmUpdateArgs) +pub enum radroots_cli::HealthCommand +pub radroots_cli::HealthCommand::Inspect +pub enum radroots_cli::ListingCommand +pub radroots_cli::ListingCommand::Create(alloc::boxed::Box<radroots_cli::ListingCreateArgs>) +pub radroots_cli::ListingCommand::Get(radroots_cli::LookupArgs) +pub radroots_cli::ListingCommand::List +pub radroots_cli::ListingCommand::Pause(radroots_cli::FileArgs) +pub radroots_cli::ListingCommand::Publish(radroots_cli::FileArgs) +pub radroots_cli::ListingCommand::Update(radroots_cli::FileArgs) +pub radroots_cli::ListingCommand::Withdraw(radroots_cli::FileArgs) +pub enum radroots_cli::MarketCommand +pub radroots_cli::MarketCommand::Get(radroots_cli::LookupArgs) +pub radroots_cli::MarketCommand::Pull +pub radroots_cli::MarketCommand::Search(radroots_cli::QueryArgs) +pub enum radroots_cli::ProfileCommand +pub radroots_cli::ProfileCommand::Inspect +pub radroots_cli::ProfileCommand::Reset +pub enum radroots_cli::ReticulumBehaviorArg +pub radroots_cli::ReticulumBehaviorArg::DeferDeliveryPlans +pub radroots_cli::ReticulumBehaviorArg::RejectDeliveryAttempts +impl radroots_cli::ReticulumBehaviorArg +pub fn radroots_cli::ReticulumBehaviorArg::as_str(self) -> &'static str +pub enum radroots_cli::SignerCommand +pub radroots_cli::SignerCommand::Status +pub enum radroots_cli::StoreCommand +pub radroots_cli::StoreCommand::Backup +pub radroots_cli::StoreCommand::Inspect +pub radroots_cli::StoreCommand::Restore(radroots_cli::StoreRestoreArgs) +pub enum radroots_cli::SyncCommand +pub radroots_cli::SyncCommand::Pull +pub radroots_cli::SyncCommand::Push +pub radroots_cli::SyncCommand::Status +pub enum radroots_cli::TargetCommand +pub radroots_cli::TargetCommand::Account(radroots_cli::AccountArgs) +pub radroots_cli::TargetCommand::Basket(radroots_cli::BasketArgs) +pub radroots_cli::TargetCommand::Diagnostics(radroots_cli::DiagnosticsArgs) +pub radroots_cli::TargetCommand::Farm(radroots_cli::FarmArgs) +pub radroots_cli::TargetCommand::Health(radroots_cli::HealthArgs) +pub radroots_cli::TargetCommand::Listing(radroots_cli::ListingArgs) +pub radroots_cli::TargetCommand::Market(radroots_cli::MarketArgs) +pub radroots_cli::TargetCommand::Profile(radroots_cli::ProfileArgs) +pub radroots_cli::TargetCommand::Signer(radroots_cli::SignerArgs) +pub radroots_cli::TargetCommand::Store(radroots_cli::StoreArgs) +pub radroots_cli::TargetCommand::Sync(radroots_cli::SyncArgs) +pub radroots_cli::TargetCommand::Trade(radroots_cli::TradeArgs) +pub radroots_cli::TargetCommand::Transport(radroots_cli::TransportArgs) +pub radroots_cli::TargetCommand::Validation(radroots_cli::ValidationArgs) +impl radroots_cli::TargetCommand +pub fn radroots_cli::TargetCommand::operation_id(&self) -> &'static str +pub enum radroots_cli::TargetOutputFormat +pub radroots_cli::TargetOutputFormat::Json +pub radroots_cli::TargetOutputFormat::Ndjson +pub radroots_cli::TargetOutputFormat::Terminal +pub enum radroots_cli::TradeCancellationCommand +pub radroots_cli::TradeCancellationCommand::Submit(radroots_cli::TradeEnvelopeFileArgs) +pub enum radroots_cli::TradeCandidateCommand +pub radroots_cli::TradeCandidateCommand::Decide(radroots_cli::TradeDecisionEnvelopeArgs) +pub enum radroots_cli::TradeCommand +pub radroots_cli::TradeCommand::Cancellation(radroots_cli::TradeCancellationArgs) +pub radroots_cli::TradeCommand::Candidate(radroots_cli::TradeCandidateArgs) +pub radroots_cli::TradeCommand::Evidence(radroots_cli::TradeEvidenceArgs) +pub radroots_cli::TradeCommand::Get(radroots_cli::TradeKeyArgs) +pub radroots_cli::TradeCommand::List(radroots_cli::TradeListArgs) +pub radroots_cli::TradeCommand::Operation(radroots_cli::TradeOperationArgs) +pub radroots_cli::TradeCommand::PrivateArtifact(radroots_cli::TradePrivateArtifactArgs) +pub radroots_cli::TradeCommand::Proposal(radroots_cli::TradeProposalArgs) +pub radroots_cli::TradeCommand::Revision(radroots_cli::TradeRevisionArgs) +pub enum radroots_cli::TradeEvidenceCommand +pub radroots_cli::TradeEvidenceCommand::Inspect(radroots_cli::TradeEvidenceInspectArgs) +pub radroots_cli::TradeEvidenceCommand::Refresh(radroots_cli::TradeKeyArgs) +pub enum radroots_cli::TradeOperationCommand +pub radroots_cli::TradeOperationCommand::Resume(radroots_cli::TradeResumeArgs) +pub enum radroots_cli::TradePrivateArtifactCommand +pub radroots_cli::TradePrivateArtifactCommand::Delete(radroots_cli::TradePrivateArtifactDeleteArgs) +pub radroots_cli::TradePrivateArtifactCommand::Open(radroots_cli::TradePrivateArtifactOpenArgs) +pub radroots_cli::TradePrivateArtifactCommand::Seal(radroots_cli::TradePrivateArtifactSealArgs) +pub enum radroots_cli::TradePrivateArtifactKindArg +pub radroots_cli::TradePrivateArtifactKindArg::BindingTerms +pub radroots_cli::TradePrivateArtifactKindArg::ContactBundle +pub radroots_cli::TradePrivateArtifactKindArg::DeliveryInstruction +pub radroots_cli::TradePrivateArtifactKindArg::Message +impl radroots_cli::TradePrivateArtifactKindArg +pub fn radroots_cli::TradePrivateArtifactKindArg::as_str(self) -> &'static str +pub enum radroots_cli::TradeProposalCommand +pub radroots_cli::TradeProposalCommand::Submit(radroots_cli::TradeEnvelopeFileArgs) +pub enum radroots_cli::TradeResumeOperationKindArg +pub radroots_cli::TradeResumeOperationKindArg::Cancel +pub radroots_cli::TradeResumeOperationKindArg::DecideCandidate +pub radroots_cli::TradeResumeOperationKindArg::ProposeRevision +pub radroots_cli::TradeResumeOperationKindArg::SubmitProposal +impl radroots_cli::TradeResumeOperationKindArg +pub fn radroots_cli::TradeResumeOperationKindArg::as_sdk_operation_kind(self) -> &'static str +pub enum radroots_cli::TradeRevisionCommand +pub radroots_cli::TradeRevisionCommand::Propose(radroots_cli::TradeEnvelopeFileArgs) +pub enum radroots_cli::TransportCapabilityCommand +pub radroots_cli::TransportCapabilityCommand::List +pub enum radroots_cli::TransportCommand +pub radroots_cli::TransportCommand::Capability(radroots_cli::TransportCapabilityArgs) +pub radroots_cli::TransportCommand::Config(radroots_cli::TransportConfigArgs) +pub radroots_cli::TransportCommand::Delivery(radroots_cli::TransportDeliveryArgs) +pub radroots_cli::TransportCommand::Status(radroots_cli::TransportStatusArgs) +pub enum radroots_cli::TransportConfigCommand +pub radroots_cli::TransportConfigCommand::Inspect +pub radroots_cli::TransportConfigCommand::Update(radroots_cli::TransportConfigUpdateArgs) +pub enum radroots_cli::TransportDeliveryCommand +pub radroots_cli::TransportDeliveryCommand::Inspect +pub radroots_cli::TransportDeliveryCommand::Retry +pub enum radroots_cli::TransportProfileKindArg +pub radroots_cli::TransportProfileKindArg::LocalOnly +pub radroots_cli::TransportProfileKindArg::MultiTarget +pub radroots_cli::TransportProfileKindArg::Nostr +pub radroots_cli::TransportProfileKindArg::Reticulum +impl radroots_cli::TransportProfileKindArg +pub fn radroots_cli::TransportProfileKindArg::as_str(self) -> &'static str +pub enum radroots_cli::TransportStatusCommand +pub radroots_cli::TransportStatusCommand::Inspect +pub enum radroots_cli::ValidationCommand +pub radroots_cli::ValidationCommand::Status +pub struct radroots_cli::AccountArgs +pub radroots_cli::AccountArgs::command: radroots_cli::AccountCommand +pub struct radroots_cli::AccountImportArgs +pub radroots_cli::AccountImportArgs::default: bool +pub radroots_cli::AccountImportArgs::path: core::option::Option<std::path::PathBuf> +pub struct radroots_cli::AccountSelectorArgs +pub radroots_cli::AccountSelectorArgs::selector: core::option::Option<alloc::string::String> +pub struct radroots_cli::BasketArgs +pub radroots_cli::BasketArgs::command: radroots_cli::BasketCommand +pub struct radroots_cli::BasketCreateArgs +pub radroots_cli::BasketCreateArgs::basket_id: core::option::Option<alloc::string::String> +pub radroots_cli::BasketCreateArgs::bin_id: core::option::Option<alloc::string::String> +pub radroots_cli::BasketCreateArgs::listing: core::option::Option<alloc::string::String> +pub radroots_cli::BasketCreateArgs::listing_addr: core::option::Option<alloc::string::String> +pub radroots_cli::BasketCreateArgs::quantity: core::option::Option<alloc::string::String> +pub struct radroots_cli::BasketItemArgs +pub radroots_cli::BasketItemArgs::command: radroots_cli::BasketItemCommand +pub struct radroots_cli::BasketItemMutationArgs +pub radroots_cli::BasketItemMutationArgs::basket_id: core::option::Option<alloc::string::String> +pub radroots_cli::BasketItemMutationArgs::bin_id: core::option::Option<alloc::string::String> +pub radroots_cli::BasketItemMutationArgs::item_id: core::option::Option<alloc::string::String> +pub radroots_cli::BasketItemMutationArgs::listing: core::option::Option<alloc::string::String> +pub radroots_cli::BasketItemMutationArgs::listing_addr: core::option::Option<alloc::string::String> +pub radroots_cli::BasketItemMutationArgs::quantity: core::option::Option<alloc::string::String> +pub struct radroots_cli::BasketItemRemoveArgs +pub radroots_cli::BasketItemRemoveArgs::basket_id: core::option::Option<alloc::string::String> +pub radroots_cli::BasketItemRemoveArgs::item_id: core::option::Option<alloc::string::String> +pub struct radroots_cli::BasketKeyArgs +pub radroots_cli::BasketKeyArgs::basket_id: core::option::Option<alloc::string::String> +pub struct radroots_cli::DiagnosticsArgs +pub radroots_cli::DiagnosticsArgs::command: radroots_cli::DiagnosticsCommand +pub struct radroots_cli::FarmArgs +pub radroots_cli::FarmArgs::command: radroots_cli::FarmCommand +pub struct radroots_cli::FarmCreateArgs +pub radroots_cli::FarmCreateArgs::about: core::option::Option<alloc::string::String> +pub radroots_cli::FarmCreateArgs::banner: core::option::Option<alloc::string::String> +pub radroots_cli::FarmCreateArgs::city: core::option::Option<alloc::string::String> +pub radroots_cli::FarmCreateArgs::country: core::option::Option<alloc::string::String> +pub radroots_cli::FarmCreateArgs::delivery_method: core::option::Option<alloc::string::String> +pub radroots_cli::FarmCreateArgs::display_name: core::option::Option<alloc::string::String> +pub radroots_cli::FarmCreateArgs::farm_d_tag: core::option::Option<alloc::string::String> +pub radroots_cli::FarmCreateArgs::geohash: core::option::Option<alloc::string::String> +pub radroots_cli::FarmCreateArgs::location: core::option::Option<alloc::string::String> +pub radroots_cli::FarmCreateArgs::name: core::option::Option<alloc::string::String> +pub radroots_cli::FarmCreateArgs::picture: core::option::Option<alloc::string::String> +pub radroots_cli::FarmCreateArgs::region: core::option::Option<alloc::string::String> +pub radroots_cli::FarmCreateArgs::website: core::option::Option<alloc::string::String> +pub struct radroots_cli::FarmUpdateArgs +pub radroots_cli::FarmUpdateArgs::field: core::option::Option<alloc::string::String> +pub radroots_cli::FarmUpdateArgs::value: core::option::Option<alloc::string::String> +pub struct radroots_cli::FileArgs +pub radroots_cli::FileArgs::file: core::option::Option<std::path::PathBuf> +pub struct radroots_cli::HealthArgs +pub radroots_cli::HealthArgs::command: radroots_cli::HealthCommand +pub struct radroots_cli::ListingArgs +pub radroots_cli::ListingArgs::command: radroots_cli::ListingCommand +pub struct radroots_cli::ListingCreateArgs +pub radroots_cli::ListingCreateArgs::available: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::bin_id: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::category: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::discount_amount: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::discount_currency: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::discount_id: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::discount_kind: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::discount_label: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::discount_value: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::key: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::label: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::output: core::option::Option<std::path::PathBuf> +pub radroots_cli::ListingCreateArgs::price_amount: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::price_currency: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::price_per_amount: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::price_per_unit: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::quantity_amount: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::quantity_unit: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::summary: core::option::Option<alloc::string::String> +pub radroots_cli::ListingCreateArgs::title: core::option::Option<alloc::string::String> +pub struct radroots_cli::LookupArgs +pub radroots_cli::LookupArgs::key: core::option::Option<alloc::string::String> +pub struct radroots_cli::MarketArgs +pub radroots_cli::MarketArgs::command: radroots_cli::MarketCommand +pub struct radroots_cli::ProfileArgs +pub radroots_cli::ProfileArgs::command: radroots_cli::ProfileCommand +pub struct radroots_cli::QueryArgs +pub radroots_cli::QueryArgs::query: alloc::vec::Vec<alloc::string::String> +pub struct radroots_cli::SignerArgs +pub radroots_cli::SignerArgs::command: radroots_cli::SignerCommand +pub struct radroots_cli::StoreArgs +pub radroots_cli::StoreArgs::command: radroots_cli::StoreCommand +pub struct radroots_cli::StoreRestoreArgs +pub radroots_cli::StoreRestoreArgs::destination: core::option::Option<std::path::PathBuf> +pub radroots_cli::StoreRestoreArgs::overwrite: bool +pub radroots_cli::StoreRestoreArgs::source: std::path::PathBuf +pub struct radroots_cli::SyncArgs +pub radroots_cli::SyncArgs::command: radroots_cli::SyncCommand +pub struct radroots_cli::TargetCliArgs +pub radroots_cli::TargetCliArgs::account_id: core::option::Option<alloc::string::String> +pub radroots_cli::TargetCliArgs::approval_proof: core::option::Option<alloc::string::String> +pub radroots_cli::TargetCliArgs::command: radroots_cli::TargetCommand +pub radroots_cli::TargetCliArgs::correlation_id: core::option::Option<alloc::string::String> +pub radroots_cli::TargetCliArgs::dry_run: bool +pub radroots_cli::TargetCliArgs::format: core::option::Option<radroots_cli::TargetOutputFormat> +pub radroots_cli::TargetCliArgs::idempotency_key: core::option::Option<alloc::string::String> +pub radroots_cli::TargetCliArgs::no_input: bool +pub radroots_cli::TargetCliArgs::offline: bool +pub radroots_cli::TargetCliArgs::online: bool +pub radroots_cli::TargetCliArgs::quiet: bool +pub radroots_cli::TargetCliArgs::trace: bool +pub radroots_cli::TargetCliArgs::verbose: bool +pub radroots_cli::TargetCliArgs::yes: bool +pub struct radroots_cli::TradeArgs +pub radroots_cli::TradeArgs::command: radroots_cli::TradeCommand +pub struct radroots_cli::TradeCancellationArgs +pub radroots_cli::TradeCancellationArgs::command: radroots_cli::TradeCancellationCommand +pub struct radroots_cli::TradeCandidateArgs +pub radroots_cli::TradeCandidateArgs::command: radroots_cli::TradeCandidateCommand +pub struct radroots_cli::TradeDecisionEnvelopeArgs +pub radroots_cli::TradeDecisionEnvelopeArgs::acknowledge_private_terms: bool +pub radroots_cli::TradeDecisionEnvelopeArgs::file: std::path::PathBuf +pub struct radroots_cli::TradeEnvelopeFileArgs +pub radroots_cli::TradeEnvelopeFileArgs::file: std::path::PathBuf +pub struct radroots_cli::TradeEvidenceArgs +pub radroots_cli::TradeEvidenceArgs::command: radroots_cli::TradeEvidenceCommand +pub struct radroots_cli::TradeEvidenceInspectArgs +pub radroots_cli::TradeEvidenceInspectArgs::cursor: core::option::Option<alloc::string::String> +pub radroots_cli::TradeEvidenceInspectArgs::limit: core::option::Option<u32> +pub radroots_cli::TradeEvidenceInspectArgs::trade_id: core::option::Option<alloc::string::String> +pub struct radroots_cli::TradeKeyArgs +pub radroots_cli::TradeKeyArgs::trade_id: core::option::Option<alloc::string::String> +pub struct radroots_cli::TradeListArgs +pub radroots_cli::TradeListArgs::cursor: core::option::Option<alloc::string::String> +pub radroots_cli::TradeListArgs::limit: core::option::Option<u32> +pub struct radroots_cli::TradeOperationArgs +pub radroots_cli::TradeOperationArgs::command: radroots_cli::TradeOperationCommand +pub struct radroots_cli::TradePrivateArtifactArgs +pub radroots_cli::TradePrivateArtifactArgs::command: radroots_cli::TradePrivateArtifactCommand +pub struct radroots_cli::TradePrivateArtifactDeleteArgs +pub radroots_cli::TradePrivateArtifactDeleteArgs::artifact_id: alloc::string::String +pub struct radroots_cli::TradePrivateArtifactOpenArgs +pub radroots_cli::TradePrivateArtifactOpenArgs::artifact_id: alloc::string::String +pub radroots_cli::TradePrivateArtifactOpenArgs::output: core::option::Option<std::path::PathBuf> +pub struct radroots_cli::TradePrivateArtifactSealArgs +pub radroots_cli::TradePrivateArtifactSealArgs::artifact_id: core::option::Option<alloc::string::String> +pub radroots_cli::TradePrivateArtifactSealArgs::candidate_id: core::option::Option<alloc::string::String> +pub radroots_cli::TradePrivateArtifactSealArgs::expires_at_ms: core::option::Option<i64> +pub radroots_cli::TradePrivateArtifactSealArgs::input: core::option::Option<std::path::PathBuf> +pub radroots_cli::TradePrivateArtifactSealArgs::kind: radroots_cli::TradePrivateArtifactKindArg +pub radroots_cli::TradePrivateArtifactSealArgs::retention_class: core::option::Option<alloc::string::String> +pub radroots_cli::TradePrivateArtifactSealArgs::schema_id: core::option::Option<alloc::string::String> +pub radroots_cli::TradePrivateArtifactSealArgs::trade_id: core::option::Option<alloc::string::String> +pub struct radroots_cli::TradeProposalArgs +pub radroots_cli::TradeProposalArgs::command: radroots_cli::TradeProposalCommand +pub struct radroots_cli::TradeResumeArgs +pub radroots_cli::TradeResumeArgs::acknowledge_private_terms: bool +pub radroots_cli::TradeResumeArgs::file: std::path::PathBuf +pub radroots_cli::TradeResumeArgs::operation_kind: core::option::Option<radroots_cli::TradeResumeOperationKindArg> +pub struct radroots_cli::TradeRevisionArgs +pub radroots_cli::TradeRevisionArgs::command: radroots_cli::TradeRevisionCommand +pub struct radroots_cli::TransportArgs +pub radroots_cli::TransportArgs::command: radroots_cli::TransportCommand +pub struct radroots_cli::TransportCapabilityArgs +pub radroots_cli::TransportCapabilityArgs::command: radroots_cli::TransportCapabilityCommand +pub struct radroots_cli::TransportConfigArgs +pub radroots_cli::TransportConfigArgs::command: radroots_cli::TransportConfigCommand +pub struct radroots_cli::TransportConfigUpdateArgs +pub radroots_cli::TransportConfigUpdateArgs::kind: radroots_cli::TransportProfileKindArg +pub radroots_cli::TransportConfigUpdateArgs::nostr_relay: alloc::vec::Vec<alloc::string::String> +pub radroots_cli::TransportConfigUpdateArgs::reticulum_agent_endpoint: core::option::Option<alloc::string::String> +pub radroots_cli::TransportConfigUpdateArgs::reticulum_behavior: core::option::Option<radroots_cli::ReticulumBehaviorArg> +pub radroots_cli::TransportConfigUpdateArgs::reticulum_scope: core::option::Option<alloc::string::String> +pub struct radroots_cli::TransportDeliveryArgs +pub radroots_cli::TransportDeliveryArgs::command: radroots_cli::TransportDeliveryCommand +pub struct radroots_cli::TransportStatusArgs +pub radroots_cli::TransportStatusArgs::command: radroots_cli::TransportStatusCommand +pub struct radroots_cli::ValidationArgs +pub radroots_cli::ValidationArgs::command: radroots_cli::ValidationCommand diff --git a/scripts/verify-boundaries.sh b/scripts/verify-boundaries.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -euo pipefail + +repo_root="$(git rev-parse --show-toplevel)" +cd "$repo_root" + +tools/verify-repository-boundary.sh +test "$(cargo public-api --version)" = "cargo-public-api 0.52.0" +temporary_api="$(mktemp)" +trap 'rm -f "$temporary_api"' EXIT +cargo +nightly-2026-07-16 public-api --all-features -sss -p radroots_cli >"$temporary_api" +cmp "$temporary_api" contracts/api_baselines/radroots_cli.txt + +if git ls-files | grep -E -i '(^|/)(\.env|id_rsa|id_ed25519|credentials|[^/]+\.(pem|key|p12|pfx|jks|keystore))$' >/dev/null; then + echo "boundary_invalid: sensitive credential path is tracked" >&2 + exit 1 +fi +if git grep -I -n -E -e '-----BEGIN ([A-Z0-9 ]+ )?PRIVATE KEY-----|AKIA[0-9A-Z]{16}|gh[pousr]_[A-Za-z0-9_]{36,}|nsec1[023456789acdefghjklmnpqrstuvwxyz]{40,}' -- src >/dev/null; then + echo "boundary_invalid: production source contains credential material" >&2 + exit 1 +fi + +echo "boundary ok: root-only API, fresh baseline, no forbidden or credential surface" diff --git a/src/cli/mod.rs b/src/cli/mod.rs @@ -1,32 +1,49 @@ -pub mod account; -pub mod basket; -pub mod diagnostics; -pub mod farm; -pub mod health; -pub mod listing; -pub mod market; -pub mod profile; -pub mod signer; -pub mod store; -pub mod sync; -pub mod trade; -pub mod transport; -pub mod validation; +mod account; +mod basket; +mod diagnostics; +mod farm; +mod health; +mod listing; +mod market; +mod profile; +mod signer; +mod store; +mod sync; +mod trade; +mod transport; +mod validation; -pub use account::*; -pub use basket::*; -pub use diagnostics::*; -pub use farm::*; -pub use health::*; -pub use listing::*; -pub use market::*; -pub use profile::*; -pub use signer::*; -pub use store::*; -pub use sync::*; -pub use trade::*; -pub use transport::*; -pub use validation::*; +pub use account::{AccountArgs, AccountCommand, AccountImportArgs, AccountSelectorArgs}; +pub use basket::{ + BasketArgs, BasketCommand, BasketCreateArgs, BasketItemArgs, BasketItemCommand, + BasketItemMutationArgs, BasketItemRemoveArgs, BasketKeyArgs, +}; +pub use diagnostics::{DiagnosticsArgs, DiagnosticsCommand}; +pub use farm::{FarmArgs, FarmCommand, FarmCreateArgs, FarmUpdateArgs}; +pub use health::{HealthArgs, HealthCommand}; +pub use listing::{FileArgs, ListingArgs, ListingCommand, ListingCreateArgs, LookupArgs}; +pub use market::{MarketArgs, MarketCommand, QueryArgs}; +pub use profile::{ProfileArgs, ProfileCommand}; +pub use signer::{SignerArgs, SignerCommand}; +pub use store::{StoreArgs, StoreCommand, StoreRestoreArgs}; +pub use sync::{SyncArgs, SyncCommand}; +pub use trade::{ + TradeArgs, TradeCancellationArgs, TradeCancellationCommand, TradeCandidateArgs, + TradeCandidateCommand, TradeCommand, TradeDecisionEnvelopeArgs, TradeEnvelopeFileArgs, + TradeEvidenceArgs, TradeEvidenceCommand, TradeEvidenceInspectArgs, TradeKeyArgs, TradeListArgs, + TradeOperationArgs, TradeOperationCommand, TradePrivateArtifactArgs, + TradePrivateArtifactCommand, TradePrivateArtifactDeleteArgs, TradePrivateArtifactKindArg, + TradePrivateArtifactOpenArgs, TradePrivateArtifactSealArgs, TradeProposalArgs, + TradeProposalCommand, TradeResumeArgs, TradeResumeOperationKindArg, TradeRevisionArgs, + TradeRevisionCommand, +}; +pub use transport::{ + ReticulumBehaviorArg, TransportArgs, TransportCapabilityArgs, TransportCapabilityCommand, + TransportCommand, TransportConfigArgs, TransportConfigCommand, TransportConfigUpdateArgs, + TransportDeliveryArgs, TransportDeliveryCommand, TransportProfileKindArg, TransportStatusArgs, + TransportStatusCommand, +}; +pub use validation::{ValidationArgs, ValidationCommand}; use clap::{ArgAction, Parser, Subcommand, ValueEnum}; diff --git a/src/lib.rs b/src/lib.rs @@ -1,3 +1,25 @@ #![forbid(unsafe_code)] -pub mod cli; +mod cli; + +pub use cli::{ + AccountArgs, AccountCommand, AccountImportArgs, AccountSelectorArgs, BasketArgs, BasketCommand, + BasketCreateArgs, BasketItemArgs, BasketItemCommand, BasketItemMutationArgs, + BasketItemRemoveArgs, BasketKeyArgs, DiagnosticsArgs, DiagnosticsCommand, FarmArgs, + FarmCommand, FarmCreateArgs, FarmUpdateArgs, FileArgs, HealthArgs, HealthCommand, ListingArgs, + ListingCommand, ListingCreateArgs, LookupArgs, MarketArgs, MarketCommand, ProfileArgs, + ProfileCommand, QueryArgs, ReticulumBehaviorArg, SignerArgs, SignerCommand, StoreArgs, + StoreCommand, StoreRestoreArgs, SyncArgs, SyncCommand, TargetCliArgs, TargetCommand, + TargetOutputFormat, TradeArgs, TradeCancellationArgs, TradeCancellationCommand, + TradeCandidateArgs, TradeCandidateCommand, TradeCommand, TradeDecisionEnvelopeArgs, + TradeEnvelopeFileArgs, TradeEvidenceArgs, TradeEvidenceCommand, TradeEvidenceInspectArgs, + TradeKeyArgs, TradeListArgs, TradeOperationArgs, TradeOperationCommand, + TradePrivateArtifactArgs, TradePrivateArtifactCommand, TradePrivateArtifactDeleteArgs, + TradePrivateArtifactKindArg, TradePrivateArtifactOpenArgs, TradePrivateArtifactSealArgs, + TradeProposalArgs, TradeProposalCommand, TradeResumeArgs, TradeResumeOperationKindArg, + TradeRevisionArgs, TradeRevisionCommand, TransportArgs, TransportCapabilityArgs, + TransportCapabilityCommand, TransportCommand, TransportConfigArgs, TransportConfigCommand, + TransportConfigUpdateArgs, TransportDeliveryArgs, TransportDeliveryCommand, + TransportProfileKindArg, TransportStatusArgs, TransportStatusCommand, ValidationArgs, + ValidationCommand, +}; diff --git a/src/main.rs b/src/main.rs @@ -3,7 +3,7 @@ use std::process::ExitCode; use clap::Parser; -use radroots_cli::cli::{ +use radroots_cli::{ HealthCommand, ProfileCommand, TargetCliArgs, TargetCommand, TargetOutputFormat, }; use serde_json::{Value, json}; diff --git a/tests/package_boundary.rs b/tests/package_boundary.rs @@ -0,0 +1,41 @@ +#![forbid(unsafe_code)] + +const ROOT: &str = include_str!("../src/lib.rs"); +const CLI_ROOT: &str = include_str!("../src/cli/mod.rs"); +const PUBLIC_API: &str = include_str!("../contracts/api_baselines/radroots_cli.txt"); + +#[test] +fn implementation_modules_are_private_and_api_is_root_only() { + assert!(ROOT.contains("mod cli;")); + assert!(!ROOT.contains("pub mod cli;")); + assert!(!ROOT.contains("pub use cli::*;")); + assert!(!CLI_ROOT.contains("::*;")); + for implementation in [ + "account", + "basket", + "diagnostics", + "farm", + "health", + "listing", + "market", + "profile", + "signer", + "store", + "sync", + "trade", + "transport", + "validation", + ] { + assert!(!PUBLIC_API.contains(&format!("radroots_cli::{implementation}::"))); + } + for required in [ + "pub struct radroots_cli::TargetCliArgs", + "pub enum radroots_cli::TargetCommand", + "pub enum radroots_cli::TargetOutputFormat", + ] { + assert!(PUBLIC_API.contains(required), "missing {required}"); + } + for dependency in ["clap::", "radroots::", "serde_json::"] { + assert!(!PUBLIC_API.contains(dependency), "leaked {dependency}"); + } +}