rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 heartwood865153569b7ac476ea1f3f08d18a761b9b1cab0f
{
"request": "trigger",
"version": 1,
"event_type": "push",
"repository": {
"id": "rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5",
"name": "heartwood",
"description": "Radicle Heartwood Protocol & Stack",
"private": false,
"default_branch": "master",
"delegates": [
"did:key:z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT",
"did:key:z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW",
"did:key:z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM",
"did:key:z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz",
"did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz"
]
},
"pusher": {
"id": "did:key:z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz",
"alias": "lorenz"
},
"before": "865153569b7ac476ea1f3f08d18a761b9b1cab0f",
"after": "865153569b7ac476ea1f3f08d18a761b9b1cab0f",
"branch": "master",
"commits": [
"865153569b7ac476ea1f3f08d18a761b9b1cab0f"
]
}
{
"response": "triggered",
"run_id": {
"id": "a8615514-6b21-400d-ac6e-ec66ff40d549"
},
"info_url": "https://cci.rad.levitte.org//a8615514-6b21-400d-ac6e-ec66ff40d549.html"
}
Started at: 2025-10-21 14:00:39.606693+02:00
Commands:
$ rad clone rad:z3gqcJUoA1n9HaHKufZs5FCSGazv5 .
✓ Creating checkout in ./...
✓ Remote cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT added
✓ Remote-tracking branch cloudhead@z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT/master created for z6MksFqXN3Yhqk8pTJdUGLwATkRfQvwZXPqR2qMEhbS9wzpT
✓ Remote cloudhead@z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW added
✓ Remote-tracking branch cloudhead@z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW/master created for z6MktaNvN1KVFMkSRAiN4qK5yvX1zuEEaseeX5sffhzPZRZW
✓ Remote fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM added
✓ Remote-tracking branch fintohaps@z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM/master created for z6MkireRatUThvd3qzfKht1S44wpm4FEWSSa4PRMTSQZ3voM
✓ Remote erikli@z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz added
✓ Remote-tracking branch erikli@z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz/master created for z6MkgFq6z5fkF2hioLLSNu1zP2qEL1aHXHZzGH1FLFGAnBGz
✓ Remote lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz added
✓ Remote-tracking branch lorenz@z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz/master created for z6MkkPvBfjP4bQmco5Dm7UGsX2ruDBieEHi8n9DVJWX5sTEz
✓ Repository successfully cloned under /opt/radcis/ci.rad.levitte.org/cci/state/a8615514-6b21-400d-ac6e-ec66ff40d549/w/
╭────────────────────────────────────╮
│ heartwood │
│ Radicle Heartwood Protocol & Stack │
│ 125 issues · 13 patches │
╰────────────────────────────────────╯
Run `cd ./.` to go to the repository directory.
Exit code: 0
$ git config advice.detachedHead false
Exit code: 0
$ git checkout 865153569b7ac476ea1f3f08d18a761b9b1cab0f
HEAD is now at 86515356 cli/node: Use clap
Exit code: 0
$ git show 865153569b7ac476ea1f3f08d18a761b9b1cab0f
commit 865153569b7ac476ea1f3f08d18a761b9b1cab0f
Author: Erik Kundt <erik@zirkular.io>
Date: Wed Oct 15 13:11:46 2025 +0200
cli/node: Use clap
Co-authored-by: Fintan Halpenny <fintan.halpenny@gmail.com>
Co-authored-by: Lorenz Leutgeb <lorenz.leutgeb@radicle.xyz>
diff --git a/crates/radicle-cli/src/commands/help.rs b/crates/radicle-cli/src/commands/help.rs
index 56275003..2adc5677 100644
--- a/crates/radicle-cli/src/commands/help.rs
+++ b/crates/radicle-cli/src/commands/help.rs
@@ -84,7 +84,10 @@ const COMMANDS: &[CommandItem] = &[
name: "ls",
about: crate::commands::ls::ABOUT,
},
- CommandItem::Lexopt(crate::commands::node::HELP),
+ CommandItem::Clap {
+ name: "node",
+ about: crate::commands::node::ABOUT,
+ },
CommandItem::Lexopt(crate::commands::patch::HELP),
CommandItem::Clap {
name: "path",
diff --git a/crates/radicle-cli/src/commands/node.rs b/crates/radicle-cli/src/commands/node.rs
index 1b217f7d..7a05e177 100644
--- a/crates/radicle-cli/src/commands/node.rs
+++ b/crates/radicle-cli/src/commands/node.rs
@@ -1,310 +1,52 @@
-use std::ffi::OsString;
-use std::path::PathBuf;
-use std::str::FromStr;
-use std::{process, time};
+mod args;
+mod commands;
+pub mod control;
+mod events;
+mod logs;
+pub mod routing;
-use anyhow::anyhow;
+use std::{process, time};
use radicle::node::address::Store as AddressStore;
use radicle::node::config::ConnectAddress;
use radicle::node::routing::Store;
use radicle::node::Handle as _;
-use radicle::node::{Address, Node, NodeId, PeerAddr};
-use radicle::prelude::RepoId;
+use radicle::node::Node;
+use crate::commands::node::args::Only;
use crate::terminal as term;
-use crate::terminal::args::{Args, Error, Help};
use crate::terminal::Element as _;
+use crate::warning;
-mod commands;
-pub mod control;
-mod events;
-mod logs;
-pub mod routing;
-
-pub const HELP: Help = Help {
- name: "node",
- description: "Control and query the Radicle Node",
- version: env!("RADICLE_VERSION"),
- usage: r#"
-Usage
-
- rad node status [<option>...]
- rad node start [--foreground] [--verbose] [<option>...] [-- <node-option>...]
- rad node stop [<option>...]
- rad node logs [-n <lines>]
- rad node debug [<option>...]
- rad node connect <nid>[@<addr>] [<option>...]
- rad node routing [--rid <rid>] [--nid <nid>] [--json] [<option>...]
- rad node inventory [--nid <nid>] [<option>...]
- rad node events [--timeout <secs>] [-n <count>] [<option>...]
- rad node config [--addresses]
- rad node db <command> [<option>..]
-
- For `<node-option>` see `radicle-node --help`.
-
-Start options
-
- --foreground Start the node in the foreground
- --path <path> Start node binary at path (default: radicle-node)
- --verbose, -v Verbose output
-
-Routing options
-
- --rid <rid> Show the routing table entries for the given RID
- --nid <nid> Show the routing table entries for the given NID
- --json Output the routing table as json
-
-Inventory options
-
- --nid <nid> List the inventory of the given NID (default: self)
-
-Events options
-
- --timeout <secs> How long to wait to receive an event before giving up
- --count, -n <count> Exit after <count> events
-
-Status options
-
- --only nid If node is running, only print the Node ID and exit,
- otherwise exit with a non-zero exit status.
-
-General options
-
- --help Print help
-"#,
-};
-
-pub struct Options {
- op: Operation,
-}
-
-/// Address used for the [`Operation::Connect`]
-pub enum Addr {
- /// Fully-specified address of the form `<NID>@<Address>`
- Peer(PeerAddr<NodeId, Address>),
- /// Just the `NID`, to be used for address lookups.
- Node(NodeId),
-}
-
-impl FromStr for Addr {
- type Err = anyhow::Error;
-
- fn from_str(s: &str) -> Result<Self, Self::Err> {
- if s.contains("@") {
- PeerAddr::from_str(s)
- .map(Self::Peer)
- .map_err(|e| anyhow!("expected <nid> or <nid>@<addr>: {e}"))
- } else {
- NodeId::from_str(s)
- .map(Self::Node)
- .map_err(|e| anyhow!("expected <nid> or <nid>@<addr>: {e}"))
- }
- }
-}
+pub use args::Args;
+pub(crate) use args::ABOUT;
+use args::{Addr, Command};
-pub enum Operation {
- Connect {
- addr: Addr,
- timeout: time::Duration,
- },
- Config {
- addresses: bool,
- },
- Db {
- args: Vec<OsString>,
- },
- Events {
- timeout: time::Duration,
- count: usize,
- },
- Routing {
- json: bool,
- rid: Option<RepoId>,
- nid: Option<NodeId>,
- },
- Start {
- foreground: bool,
- verbose: bool,
- path: PathBuf,
- options: Vec<OsString>,
- },
- Logs {
- lines: usize,
- },
- Status {
- only_nid: bool,
- },
- Inventory {
- nid: Option<NodeId>,
- },
- Debug,
- Sessions,
- Stop,
-}
-
-#[derive(Default, PartialEq, Eq)]
-pub enum OperationName {
- Connect,
- Config,
- Db,
- Events,
- Routing,
- Logs,
- Start,
- #[default]
- Status,
- Inventory,
- Debug,
- Sessions,
- Stop,
-}
-
-impl Args for Options {
- fn from_args(args: Vec<OsString>) -> anyhow::Result<(Self, Vec<OsString>)> {
- use lexopt::prelude::*;
-
- let mut foreground = false;
- let mut options = vec![];
- let mut parser = lexopt::Parser::from_args(args);
- let mut op: Option<OperationName> = None;
- let mut nid: Option<NodeId> = None;
- let mut rid: Option<RepoId> = None;
- let mut json: bool = false;
- let mut addr: Option<Addr> = None;
- let mut lines: usize = 60;
- let mut count: usize = usize::MAX;
- let mut timeout = time::Duration::MAX;
- let mut addresses = false;
- let mut path = None;
- let mut verbose = false;
- let mut only_nid = false;
-
- while let Some(arg) = parser.next()? {
- match arg {
- Long("help") | Short('h') => {
- return Err(Error::Help.into());
- }
- Value(val) if op.is_none() => match val.to_string_lossy().as_ref() {
- "connect" => op = Some(OperationName::Connect),
- "db" => op = Some(OperationName::Db),
- "events" => op = Some(OperationName::Events),
- "logs" => op = Some(OperationName::Logs),
- "config" => op = Some(OperationName::Config),
- "routing" => op = Some(OperationName::Routing),
- "inventory" => op = Some(OperationName::Inventory),
- "start" => op = Some(OperationName::Start),
- "status" => op = Some(OperationName::Status),
- "stop" => op = Some(OperationName::Stop),
- "sessions" => op = Some(OperationName::Sessions),
- "debug" => op = Some(OperationName::Debug),
-
- unknown => anyhow::bail!("unknown operation '{}'", unknown),
- },
- Value(val) if matches!(op, Some(OperationName::Connect)) => {
- addr = Some(val.parse()?);
- }
- Long("rid") if matches!(op, Some(OperationName::Routing)) => {
- let val = parser.value()?;
- rid = term::args::rid(&val).ok();
- }
- Long("nid")
- if matches!(op, Some(OperationName::Routing))
- || matches!(op, Some(OperationName::Inventory)) =>
- {
- let val = parser.value()?;
- nid = term::args::nid(&val).ok();
- }
- Long("only") if matches!(op, Some(OperationName::Status)) => {
- if &parser.value()? == "nid" {
- only_nid = true;
- } else {
- anyhow::bail!("unknown argument to --only");
- }
- }
- Long("json") if matches!(op, Some(OperationName::Routing)) => json = true,
- Long("timeout")
- if op == Some(OperationName::Events) || op == Some(OperationName::Connect) =>
- {
- let val = parser.value()?;
- timeout = term::args::seconds(&val)?;
- }
- Long("count") | Short('n') if matches!(op, Some(OperationName::Events)) => {
- let val = parser.value()?;
- count = term::args::number(&val)?;
- }
- Long("foreground") if matches!(op, Some(OperationName::Start)) => {
- foreground = true;
- }
- Long("addresses") if matches!(op, Some(OperationName::Config)) => {
- addresses = true;
- }
- Long("verbose") | Short('v') if matches!(op, Some(OperationName::Start)) => {
- verbose = true;
- }
- Long("path") if matches!(op, Some(OperationName::Start)) => {
- let val = parser.value()?;
- path = Some(PathBuf::from(val));
- }
- Short('n') if matches!(op, Some(OperationName::Logs)) => {
- lines = parser.value()?.parse()?;
- }
- Value(val) if matches!(op, Some(OperationName::Start)) => {
- options.push(val);
- }
- Value(val) if matches!(op, Some(OperationName::Db)) => {
- options.push(val);
- }
- _ => return Err(anyhow!(arg.unexpected())),
- }
- }
-
- let op = match op.unwrap_or_default() {
- OperationName::Connect => Operation::Connect {
- addr: addr.ok_or_else(|| {
- anyhow!("an `<nid>` or an address of the form `<nid>@<host>:<port>` must be provided")
- })?,
- timeout,
- },
- OperationName::Config => Operation::Config { addresses },
- OperationName::Db => Operation::Db { args: options },
- OperationName::Events => Operation::Events { timeout, count },
- OperationName::Routing => Operation::Routing { rid, nid, json },
- OperationName::Logs => Operation::Logs { lines },
- OperationName::Start => Operation::Start {
- foreground,
- verbose,
- options,
- path: path.unwrap_or(PathBuf::from("radicle-node")),
- },
- OperationName::Inventory => Operation::Inventory { nid },
- OperationName::Status => Operation::Status { only_nid },
- OperationName::Debug => Operation::Debug,
- OperationName::Sessions => Operation::Sessions,
- OperationName::Stop => Operation::Stop,
- };
- Ok((Options { op }, vec![]))
- }
-}
-
-pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
+pub fn run(args: Args, ctx: impl term::Context) -> anyhow::Result<()> {
let profile = ctx.profile()?;
let mut node = Node::new(profile.socket());
- match options.op {
- Operation::Connect { addr, timeout } => match addr {
- Addr::Peer(addr) => control::connect(&mut node, addr.id, addr.addr, timeout)?,
- Addr::Node(nid) => {
- let db = profile.database()?;
- let addresses = db
- .addresses_of(&nid)?
- .into_iter()
- .map(|ka| ka.addr)
- .collect();
- control::connect_many(&mut node, nid, addresses, timeout)?;
+ let command = args.command.unwrap_or_default();
+
+ match command {
+ Command::Connect { addr, timeout } => {
+ let timeout = timeout
+ .map(time::Duration::from_secs)
+ .unwrap_or(time::Duration::MAX);
+ match addr {
+ Addr::Peer(addr) => control::connect(&mut node, addr.id, addr.addr, timeout)?,
+ Addr::Node(nid) => {
+ let db = profile.database()?;
+ let addresses = db
+ .addresses_of(&nid)?
+ .into_iter()
+ .map(|ka| ka.addr)
+ .collect();
+ control::connect_many(&mut node, nid, addresses, timeout)?;
+ }
}
- },
- Operation::Config { addresses } => {
+ }
+ Command::Config { addresses } => {
if addresses {
let cfg = node.config()?;
for addr in cfg.external_addresses {
@@ -314,27 +56,33 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
control::config(&node)?;
}
}
- Operation::Db { args } => {
- commands::db(&profile, args)?;
+ Command::Db(op) => {
+ commands::db(&profile, op)?;
}
- Operation::Debug => {
+ Command::Debug => {
control::debug(&mut node)?;
}
- Operation::Sessions => {
+ Command::Sessions => {
+ warning::deprecated("rad node sessions", "rad node status");
let sessions = control::sessions(&node)?;
if let Some(table) = sessions {
table.print();
}
}
- Operation::Events { timeout, count } => {
+ Command::Events { timeout, count } => {
+ let count = count.unwrap_or(usize::MAX);
+ let timeout = timeout
+ .map(time::Duration::from_secs)
+ .unwrap_or(time::Duration::MAX);
+
events::run(node, count, timeout)?;
}
- Operation::Routing { rid, nid, json } => {
+ Command::Routing { rid, nid, json } => {
let store = profile.database()?;
routing::run(&store, rid, nid, json)?;
}
- Operation::Logs { lines } => control::logs(lines, Some(time::Duration::MAX), &profile)?,
- Operation::Start {
+ Command::Logs { lines } => control::logs(lines, Some(time::Duration::MAX), &profile)?,
+ Command::Start {
foreground,
options,
path,
@@ -342,23 +90,25 @@ pub fn run(options: Options, ctx: impl term::Context) -> anyhow::Result<()> {
} => {
control::start(node, !foreground, verbose, options, &path, &profile)?;
}
- Operation::Inventory { nid } => {
+ Command::Inventory { nid } => {
let nid = nid.as_ref().unwrap_or(profile.id());
for rid in profile.routing()?.get_inventory(nid)? {
println!("{}", term::format::tertiary(rid));
}
}
- Operation::Status { only_nid: false } => {
- control::status(&node, &profile)?;
- }
- Operation::Status { only_nid: true } => {
+ Command::Status {
+ only: Some(Only::Nid),
+ } => {
if node.is_running() {
term::print(term::format::node_id_human(&node.nid()?));
} else {
process::exit(2);
}
}
- Operation::Stop => {
+ Command::Status { only: None } => {
+ control::status(&node, &profile)?;
+ }
+ Command::Stop => {
control::stop(node, &profile);
}
}
diff --git a/crates/radicle-cli/src/commands/node/args.rs b/crates/radicle-cli/src/commands/node/args.rs
new file mode 100644
index 00000000..7bcd590f
--- /dev/null
+++ b/crates/radicle-cli/src/commands/node/args.rs
@@ -0,0 +1,231 @@
+use std::ffi::OsString;
+use std::fmt::Debug;
+use std::path::PathBuf;
+use std::str::FromStr;
+
+use thiserror::Error;
+
+use clap::{Parser, Subcommand};
+
+use radicle::crypto::{PublicKey, PublicKeyError};
+use radicle::node::{Address, NodeId, PeerAddr, PeerAddrParseError};
+use radicle::prelude::RepoId;
+
+pub(crate) const ABOUT: &str = "Control and query the Radicle Node";
+
+#[derive(Parser, Debug)]
+#[command(about = ABOUT, long_about, disable_version_flag = true)]
+pub struct Args {
+ #[command(subcommand)]
+ pub(super) command: Option<Command>,
+}
+
+/// Address used for the [`Operation::Connect`]
+#[derive(Clone, Debug)]
+pub(super) enum Addr {
+ /// Fully-specified address of the form `<NID>@<ADDR>`
+ Peer(PeerAddr<NodeId, Address>),
+ /// Just the `NID`, to be used for address lookups.
+ Node(NodeId),
+}
+
+#[derive(Error, Debug)]
+pub(super) enum AddrParseError {
+ #[error("{0}, expected <NID> or <NID>@<ADDR>")]
+ PeerAddr(#[from] PeerAddrParseError<PublicKey>),
+ #[error(transparent)]
+ NodeId(#[from] PublicKeyError),
+}
+
+impl FromStr for Addr {
+ type Err = AddrParseError;
+
+ fn from_str(s: &str) -> Result<Self, Self::Err> {
+ if s.contains("@") {
+ PeerAddr::from_str(s)
+ .map(Self::Peer)
+ .map_err(AddrParseError::PeerAddr)
+ } else {
+ NodeId::from_str(s)
+ .map(Self::Node)
+ .map_err(AddrParseError::NodeId)
+ }
+ }
+}
+
+#[derive(Clone, Debug)]
+pub enum Only {
+ Nid,
+}
+
+#[derive(Error, Debug)]
+#[error("could not parse value `{0}`")]
+pub struct OnlyParseError(String);
+
+impl FromStr for Only {
+ type Err = OnlyParseError;
+
+ fn from_str(value: &str) -> Result<Self, Self::Err> {
+ match value {
+ "nid" => Ok(Only::Nid),
+ _ => Err(OnlyParseError(value.to_string())),
+ }
+ }
+}
+
+#[derive(Clone, Debug)]
+struct OnlyParser;
+
+impl clap::builder::TypedValueParser for OnlyParser {
+ type Value = Only;
+
+ fn parse_ref(
+ &self,
+ cmd: &clap::Command,
+ arg: Option<&clap::Arg>,
+ value: &std::ffi::OsStr,
+ ) -> Result<Self::Value, clap::Error> {
+ <Only as std::str::FromStr>::from_str.parse_ref(cmd, arg, value)
+ }
+
+ fn possible_values(
+ &self,
+ ) -> Option<Box<dyn Iterator<Item = clap::builder::PossibleValue> + '_>> {
+ use clap::builder::PossibleValue;
+ Some(Box::new([PossibleValue::new("nid")].into_iter()))
+ }
+}
+
+#[derive(Subcommand, Debug)]
+pub(super) enum Command {
+ /// Instruct the node to connect to another node
+ Connect {
+ /// The Node ID, and optionally the address and port, of the node to connect to
+ #[arg(value_name = "NID[@ADDR]")]
+ addr: Addr,
+
+ /// How long to wait for the connection to be established
+ #[arg(long, value_name = "SECS")]
+ timeout: Option<u64>,
+ },
+
+ /// Show the config
+ Config {
+ /// Only show external addresses from the node's config
+ #[arg(long)]
+ addresses: bool,
+ },
+
+ /// Interact with the node database
+ #[command(subcommand, hide = true)]
+ Db(DbOperation),
+
+ /// Watch and print events.
+ ///
+ /// This command will connect to the node and print events to
+ /// standard output as they occur.
+ ///
+ /// If no timeout or count is specified, it will run indefinitely.
+ Events {
+ /// How long to wait to receive an event before giving up
+ #[arg(long, value_name = "SECS")]
+ timeout: Option<u64>,
+
+ /// Exit after <COUNT> events
+ #[arg(long, short = 'n')]
+ count: Option<usize>,
+ },
+
+ /// Show the routing table
+ Routing {
+ /// Output the routing table as json
+ #[arg(long)]
+ json: bool,
+
+ /// Show the routing table entries for the given RID
+ #[arg(long)]
+ rid: Option<RepoId>,
+
+ /// Show the routing table entries for the given NID
+ #[arg(long)]
+ nid: Option<NodeId>,
+ },
+
+ /// Start the node
+ Start {
+ /// Start the node in the foreground
+ #[arg(long)]
+ foreground: bool,
+
+ /// Verbose output
+ #[arg(long, short)]
+ verbose: bool,
+
+ /// Start node binary at path
+ #[arg(long, default_value = "radicle-node")]
+ path: PathBuf,
+
+ /// Additional options to pass to the binary
+ ///
+ /// See `radicle-node --help` for additional options
+ #[arg(value_name = "NODE_OPTIONS", last = true, num_args = 1..)]
+ options: Vec<OsString>,
+ },
+
+ /// Show the log
+ Logs {
+ /// Only show <COUNT> lines of the log
+ #[arg(long, value_name = "COUNT", default_value_t = 60)]
+ lines: usize,
+ },
+
+ /// Show the status
+ Status {
+ /// If node is running, only print the Node ID and exit, otherwise exit with a non-zero exit status.
+ #[arg(long, value_parser = OnlyParser)]
+ only: Option<Only>,
+ },
+
+ /// Manage the inventory
+ Inventory {
+ /// List the inventory of the given NID, defaults to `self`
+ #[arg(long)]
+ nid: Option<NodeId>,
+ },
+
+ /// Show debug information related to the running node.
+ ///
+ /// This includes metrics fetching, peer connections, rate limiting, etc.
+ Debug,
+
+ /// Show the active sessions of the running node.
+ ///
+ /// Deprecated, use `status` instead.
+ #[command(hide = true)]
+ Sessions,
+
+ /// Stop the node
+ Stop,
+}
+
+impl Default for Command {
+ fn default() -> Self {
+ Command::Status { only: None }
+ }
+}
+
+/// Operations related to the [`Command::Db`]
+#[derive(Debug, Subcommand)]
+pub(super) enum DbOperation {
+ /// Execute an SQL operation on the local node database.
+ ///
+ /// The command only returns the number of rows that are affected by the
+ /// query. This means that `SELECT` queries will not return their output.
+ ///
+ /// The command should only be used for executing queries given you know
+ /// what you are doing.
+ Exec {
+ #[arg(value_name = "SQL")]
+ query: String,
+ },
+}
diff --git a/crates/radicle-cli/src/commands/node/commands.rs b/crates/radicle-cli/src/commands/node/commands.rs
index c0b3daef..5c556d3a 100644
--- a/crates/radicle-cli/src/commands/node/commands.rs
+++ b/crates/radicle-cli/src/commands/node/commands.rs
@@ -1,39 +1,11 @@
-use std::ffi::OsString;
-
-use anyhow::anyhow;
use radicle::Profile;
use radicle_term as term;
-#[derive(PartialEq, Eq)]
-pub enum Operation {
- Exec { query: String },
-}
-
-pub fn db(profile: &Profile, args: Vec<OsString>) -> anyhow::Result<()> {
- use lexopt::prelude::*;
-
- let mut parser = lexopt::Parser::from_args(args);
- let mut op: Option<Operation> = None;
-
- while let Some(arg) = parser.next()? {
- match arg {
- Value(cmd) if op.is_none() => match cmd.to_string_lossy().as_ref() {
- "exec" => {
- let val = parser
- .value()
- .map_err(|_| anyhow!("a query to execute must be provided for `exec`"))?;
- op = Some(Operation::Exec {
- query: val.to_string_lossy().to_string(),
- });
- }
- unknown => anyhow::bail!("unknown operation '{unknown}'"),
- },
- _ => return Err(anyhow!(arg.unexpected())),
- }
- }
+use super::args::DbOperation;
- match op.ok_or_else(|| anyhow!("a command must be provided, eg. `rad node db exec`"))? {
- Operation::Exec { query } => {
+pub fn db(profile: &Profile, op: DbOperation) -> anyhow::Result<()> {
+ match op {
+ DbOperation::Exec { query } => {
let db = profile.database_mut()?;
db.execute(query)?;
diff --git a/crates/radicle-cli/src/main.rs b/crates/radicle-cli/src/main.rs
index 5b61332f..f5c0b865 100644
--- a/crates/radicle-cli/src/main.rs
+++ b/crates/radicle-cli/src/main.rs
@@ -72,6 +72,7 @@ enum Commands {
Init(init::Args),
Issue(issue::Args),
Ls(ls::Args),
+ Node(node::Args),
Path(path::Args),
Publish(publish::Args),
Remote(remote::Args),
@@ -292,7 +293,9 @@ pub(crate) fn run_other(exe: &str, args: &[OsString]) -> Result<(), Option<anyho
}
}
"node" => {
- term::run_command_args::<node::Options, _>(node::HELP, node::run, args.to_vec());
+ if let Some(Commands::Node(args)) = CliArgs::parse().command {
+ term::run_command_fn(node::run, args);
+ }
}
"patch" => {
term::run_command_args::<patch::Options, _>(patch::HELP, patch::run, args.to_vec());
Exit code: 0
shell: 'export RUSTDOCFLAGS=''-D warnings'' cargo --version rustc --version cargo fmt --check cargo clippy --all-targets --workspace -- --deny warnings cargo build --all-targets --workspace cargo doc --workspace --no-deps cargo test --workspace --no-fail-fast '
Commands:
$ podman run --name a8615514-6b21-400d-ac6e-ec66ff40d549 -v /opt/radcis/ci.rad.levitte.org/cci/state/a8615514-6b21-400d-ac6e-ec66ff40d549/s:/a8615514-6b21-400d-ac6e-ec66ff40d549/s:ro -v /opt/radcis/ci.rad.levitte.org/cci/state/a8615514-6b21-400d-ac6e-ec66ff40d549/w:/a8615514-6b21-400d-ac6e-ec66ff40d549/w -w /a8615514-6b21-400d-ac6e-ec66ff40d549/w -v /opt/radcis/ci.rad.levitte.org/.radicle:/${id}/.radicle:ro -e RAD_HOME=/${id}/.radicle rust:bookworm bash /a8615514-6b21-400d-ac6e-ec66ff40d549/s/script.sh
+ export 'RUSTDOCFLAGS=-D warnings'
+ RUSTDOCFLAGS='-D warnings'
+ cargo --version
info: syncing channel updates for '1.90-x86_64-unknown-linux-gnu'
info: latest update on 2025-09-18, rust version 1.90.0 (1159e78c4 2025-09-14)
info: downloading component 'cargo'
info: downloading component 'clippy'
info: downloading component 'rust-docs'
info: downloading component 'rust-src'
info: downloading component 'rust-std'
info: downloading component 'rustc'
info: downloading component 'rustfmt'
info: installing component 'cargo'
info: installing component 'clippy'
info: installing component 'rust-docs'
info: installing component 'rust-src'
info: installing component 'rust-std'
info: installing component 'rustc'
info: installing component 'rustfmt'
cargo 1.90.0 (840b83a10 2025-07-30)
+ rustc --version
rustc 1.90.0 (1159e78c4 2025-09-14)
+ cargo fmt --check
+ cargo clippy --all-targets --workspace -- --deny warnings
Updating crates.io index
Downloading crates ...
Downloaded amplify_derive v4.0.0
Downloaded console v0.16.0
Downloaded adler2 v2.0.0
Downloaded addr2line v0.24.2
Downloaded aead v0.5.2
Downloaded autocfg v1.2.0
Downloaded libgit2-sys v0.17.0+1.8.1
Downloaded bitflags v2.9.1
Downloaded block-padding v0.3.3
Downloaded block-buffer v0.10.4
Downloaded base64 v0.22.1
Downloaded generic-array v0.14.7
Downloaded flate2 v1.1.1
Downloaded normalize-line-endings v0.3.0
Downloaded cipher v0.4.4
Downloaded clap_lex v0.7.5
Downloaded gimli v0.31.1
Downloaded num-iter v0.1.45
Downloaded gix-path v0.10.20
Downloaded gix-lock v18.0.0
Downloaded gix-negotiate v0.21.0
Downloaded icu_locid v1.5.0
Downloaded icu_provider v1.5.0
Downloaded proc-macro-error-attr2 v2.0.0
Downloaded gix-pack v0.60.0
Downloaded idna_adapter v1.2.0
Downloaded git2 v0.19.0
Downloaded log v0.4.27
Downloaded iana-time-zone v0.1.60
Downloaded escargot v0.5.10
Downloaded libz-rs-sys v0.5.2
Downloaded lazy_static v1.5.0
Downloaded localtime v1.3.1
Downloaded matchers v0.1.0
Downloaded icu_provider_macros v1.5.0
Downloaded base-x v0.2.11
Downloaded data-encoding v2.5.0
Downloaded gix-utils v0.3.0
Downloaded itoa v1.0.11
Downloaded lexopt v0.3.0
Downloaded regex-automata v0.1.10
Downloaded litrs v0.4.1
Downloaded newline-converter v0.3.0
Downloaded indexmap v2.2.6
Downloaded sqlite v0.32.0
Downloaded itertools v0.14.0
Downloaded stable_deref_trait v1.2.0
Downloaded memmap2 v0.9.8
Downloaded maybe-async v0.2.10
Downloaded icu_properties_data v1.5.1
Downloaded num v0.4.3
Downloaded tinystr v0.7.6
Downloaded aes-gcm v0.10.3
Downloaded tar v0.4.40
Downloaded num-cmp v0.1.0
Downloaded overload v0.1.1
Downloaded opaque-debug v0.3.1
Downloaded outref v0.5.2
Downloaded poly1305 v0.8.0
Downloaded pbkdf2 v0.12.2
Downloaded radicle-std-ext v0.1.1
Downloaded phf v0.11.3
Downloaded rand_chacha v0.3.1
Downloaded paste v1.0.15
Downloaded num-rational v0.4.2
Downloaded qcheck-macros v1.0.0
Downloaded qcheck v1.0.0
Downloaded radicle-git-ext v0.10.0
Downloaded polyval v0.6.2
Downloaded pem-rfc7468 v0.7.0
Downloaded rfc6979 v0.4.0
Downloaded proc-macro-error2 v2.0.1
Downloaded sec1 v0.7.3
Downloaded scopeguard v1.2.0
Downloaded parking_lot_core v0.9.12
Downloaded schemars_derive v1.0.4
Downloaded clap_builder v4.5.44
Downloaded tree-sitter-c v0.23.2
Downloaded tinyvec_macros v0.1.1
Downloaded sha1 v0.10.6
Downloaded strsim v0.11.1
Downloaded parking_lot v0.12.5
Downloaded subtle v2.5.0
Downloaded structured-logger v1.0.4
Downloaded signature v1.6.4
Downloaded sval_buffer v2.14.1
Downloaded thread_local v1.1.9
Downloaded serde v1.0.219
Downloaded timeago v0.4.2
Downloaded sem_safe v0.2.0
Downloaded tree-sitter-go v0.23.4
Downloaded unit-prefix v0.5.1
Downloaded thiserror v2.0.12
Downloaded tree-sitter-json v0.24.8
Downloaded thiserror v1.0.69
Downloaded synstructure v0.13.1
Downloaded utf8parse v0.2.1
Downloaded utf8_iter v1.0.4
Downloaded tracing-log v0.2.0
Downloaded toml_writer v1.0.2
Downloaded unicode-display-width v0.3.0
Downloaded tree-sitter-toml-ng v0.6.0
Downloaded vsimd v0.8.0
Downloaded zerofrom-derive v0.1.6
Downloaded xattr v1.3.1
Downloaded zerovec-derive v0.10.3
Downloaded zeroize v1.7.0
Downloaded uuid-simd v0.8.0
Downloaded zerofrom v0.1.6
Downloaded unicode-width v0.1.11
Downloaded write16 v1.0.0
Downloaded tracing-core v0.1.34
Downloaded yoke v0.7.5
Downloaded rustix v0.38.34
Downloaded uuid v1.16.0
Downloaded url v2.5.4
Downloaded ssh-key v0.6.6
Downloaded linux-raw-sys v0.4.13
Downloaded serde_json v1.0.140
Downloaded unicode-segmentation v1.11.0
Downloaded zerovec v0.10.4
Downloaded tree-sitter-python v0.23.4
Downloaded zerocopy v0.7.35
Downloaded winnow v0.7.13
Downloaded vcpkg v0.2.15
Downloaded zlib-rs v0.5.2
Downloaded syn v2.0.106
Downloaded syn v1.0.109
Downloaded tree-sitter-md v0.3.2
Downloaded unicode-width v0.2.1
Downloaded regex-automata v0.4.9
Downloaded object v0.36.7
Downloaded tree-sitter-rust v0.23.2
Downloaded tracing-subscriber v0.3.19
Downloaded p384 v0.13.0
Downloaded unicode-normalization v0.1.23
Downloaded tree-sitter-bash v0.23.3
Downloaded tree-sitter v0.24.4
Downloaded portable-atomic v1.11.0
Downloaded tracing v0.1.41
Downloaded p521 v0.13.3
Downloaded tree-sitter-ruby v0.23.1
Downloaded sha1-checked v0.10.0
Downloaded bstr v1.12.0
Downloaded unicode-ident v1.0.12
Downloaded typenum v1.17.0
Downloaded tree-sitter-css v0.23.1
Downloaded bloomy v1.2.0
Downloaded writeable v0.5.5
Downloaded value-bag-sval2 v1.11.1
Downloaded value-bag v1.11.1
Downloaded walkdir v2.5.0
Downloaded sha3 v0.10.8
Downloaded tinyvec v1.6.0
Downloaded tree-sitter-highlight v0.24.4
Downloaded tree-sitter-typescript v0.23.2
Downloaded tokio v1.47.1
Downloaded yoke-derive v0.7.5
Downloaded yansi v0.5.1
Downloaded utf16_iter v1.0.5
Downloaded sval_serde v2.14.1
Downloaded regex v1.11.1
Downloaded linux-raw-sys v0.9.4
Downloaded toml_datetime v0.7.0
Downloaded value-bag-serde1 v1.11.1
Downloaded tree-sitter-language v0.1.2
Downloaded toml v0.9.5
Downloaded tempfile v3.23.0
Downloaded prodash v30.0.1
Downloaded version_check v0.9.4
Downloaded socks5-client v0.4.1
Downloaded test-log v0.2.18
Downloaded spin v0.9.8
Downloaded sval_json v2.14.1
Downloaded sval_dynamic v2.14.1
Downloaded rsa v0.9.6
Downloaded thiserror-impl v1.0.69
Downloaded test-log-macros v0.2.18
Downloaded socket2 v0.5.7
Downloaded universal-hash v0.5.1
Downloaded typeid v1.0.3
Downloaded sharded-slab v0.1.7
Downloaded regex-syntax v0.8.5
Downloaded num-bigint-dig v0.8.4
Downloaded sval_fmt v2.14.1
Downloaded sqlite3-sys v0.15.2
Downloaded spki v0.7.3
Downloaded similar v2.5.0
Downloaded serde_derive v1.0.219
Downloaded snapbox-macros v0.3.8
Downloaded smallvec v1.15.1
Downloaded signals_receipts v0.2.0
Downloaded shell-words v1.1.0
Downloaded tree-sitter-html v0.23.2
Downloaded systemd-journal-logger v2.2.2
Downloaded sval v2.14.1
Downloaded ssh-encoding v0.2.0
Downloaded ssh-cipher v0.2.0
Downloaded snapbox v0.4.17
Downloaded siphasher v1.0.1
Downloaded rustix v1.0.7
Downloaded signal-hook v0.3.18
Downloaded streaming-iterator v0.1.9
Downloaded signal-hook-mio v0.2.4
Downloaded radicle-surf v0.25.0
Downloaded aho-corasick v1.1.3
Downloaded schemars v1.0.4
Downloaded regex-syntax v0.6.29
Downloaded thiserror-impl v2.0.12
Downloaded shlex v1.3.0
Downloaded sha2 v0.10.8
Downloaded sval_nested v2.14.1
Downloaded serde_derive_internals v0.29.1
Downloaded referencing v0.30.0
Downloaded rand v0.8.5
Downloaded p256 v0.13.2
Downloaded num-bigint v0.4.6
Downloaded pretty_assertions v1.4.0
Downloaded siphasher v0.3.11
Downloaded serde_fmt v1.0.3
Downloaded same-file v1.0.6
Downloaded ryu v1.0.17
Downloaded rustc-demangle v0.1.26
Downloaded proc-macro2 v1.0.101
Downloaded os_info v3.12.0
Downloaded sval_ref v2.14.1
Downloaded signature v2.2.0
Downloaded signal-hook-registry v1.4.5
Downloaded serde_spanned v1.0.0
Downloaded serde-untagged v0.1.7
Downloaded scrypt v0.11.0
Downloaded rand_core v0.6.4
Downloaded ref-cast-impl v1.0.24
Downloaded quote v1.0.41
Downloaded pkcs1 v0.7.5
Downloaded num-traits v0.2.19
Downloaded salsa20 v0.10.2
Downloaded pkg-config v0.3.30
Downloaded pin-project-lite v0.2.16
Downloaded ref-cast v1.0.24
Downloaded pkcs8 v0.10.2
Downloaded mio v1.0.4
Downloaded phf_shared v0.11.3
Downloaded percent-encoding v2.3.1
Downloaded libc v0.2.174
Downloaded crossterm v0.29.0
Downloaded primeorder v0.13.6
Downloaded jiff v0.2.15
Downloaded emojis v0.6.4
Downloaded ppv-lite86 v0.2.17
Downloaded num-complex v0.4.6
Downloaded num-integer v0.1.46
Downloaded mio v0.8.11
Downloaded once_cell v1.21.3
Downloaded nu-ansi-term v0.46.0
Downloaded noise-framework v0.4.0
Downloaded nonempty v0.9.0
Downloaded miniz_oxide v0.8.8
Downloaded derive_more v2.0.1
Downloaded crypto-bigint v0.5.5
Downloaded diff v0.1.13
Downloaded der v0.7.9
Downloaded idna v1.0.3
Downloaded hashbrown v0.15.5
Downloaded multibase v0.9.1
Downloaded memchr v2.7.2
Downloaded ascii v1.1.0
Downloaded erased-serde v0.4.6
Downloaded env_filter v0.1.3
Downloaded displaydoc v0.2.5
Downloaded lock_api v0.4.14
Downloaded libm v0.2.8
Downloaded indicatif v0.18.0
Downloaded gix-ref v0.53.1
Downloaded fancy-regex v0.14.0
Downloaded ecdsa v0.16.9
Downloaded ec25519 v0.1.0
Downloaded anyhow v1.0.82
Downloaded jsonschema v0.30.0
Downloaded gix-revision v0.35.0
Downloaded derive_more-impl v2.0.1
Downloaded bytes v1.10.1
Downloaded cc v1.2.2
Downloaded ahash v0.8.11
Downloaded document-features v0.2.11
Downloaded cypheraddr v0.4.0
Downloaded inquire v0.7.5
Downloaded icu_locid_transform_data v1.5.1
Downloaded icu_collections v1.5.0
Downloaded hmac v0.12.1
Downloaded gix-shallow v0.5.0
Downloaded faster-hex v0.10.0
Downloaded gix-quote v0.6.0
Downloaded convert_case v0.7.1
Downloaded elliptic-curve v0.13.8
Downloaded cyphergraphy v0.3.0
Downloaded crossbeam-utils v0.8.19
Downloaded anstyle v1.0.11
Downloaded crossbeam-channel v0.5.15
Downloaded litemap v0.7.5
Downloaded jobserver v0.1.31
Downloaded equivalent v1.0.1
Downloaded data-encoding-macro v0.1.14
Downloaded ct-codecs v1.1.1
Downloaded inout v0.1.3
Downloaded icu_properties v1.5.1
Downloaded hash32 v0.3.1
Downloaded dyn-clone v1.0.17
Downloaded const-oid v0.9.6
Downloaded keccak v0.1.5
Downloaded heck v0.5.0
Downloaded ff v0.13.0
Downloaded data-encoding-macro-internal v0.1.12
Downloaded crypto-common v0.1.6
Downloaded errno v0.3.13
Downloaded crossterm v0.25.0
Downloaded byteorder v1.5.0
Downloaded human-panic v2.0.3
Downloaded hashbrown v0.14.3
Downloaded group v0.13.0
Downloaded gix-validate v0.10.0
Downloaded gix-transport v0.48.0
Downloaded gix-sec v0.12.0
Downloaded gix-protocol v0.51.0
Downloaded gix-hashtable v0.9.0
Downloaded gix-features v0.43.1
Downloaded gix-actor v0.35.4
Downloaded git-ref-format-macro v0.5.0
Downloaded fxhash v0.2.1
Downloaded fluent-uri v0.3.2
Downloaded env_logger v0.11.8
Downloaded dunce v1.0.5
Downloaded crc32fast v1.5.0
Downloaded colorchoice v1.0.0
Downloaded bcrypt-pbkdf v0.10.0
Downloaded anstyle-parse v0.2.3
Downloaded jiff-static v0.2.15
Downloaded icu_normalizer_data v1.5.1
Downloaded icu_normalizer v1.5.0
Downloaded home v0.5.9
Downloaded gix-traverse v0.47.0
Downloaded gix-trace v0.1.13
Downloaded gix-revwalk v0.21.0
Downloaded git-ref-format-core v0.5.0
Downloaded fast-glob v0.3.3
Downloaded ctr v0.9.2
Downloaded clap_derive v4.5.41
Downloaded bytesize v2.0.1
Downloaded base32 v0.4.0
Downloaded arc-swap v1.7.1
Downloaded ed25519 v1.5.3
Downloaded cfg-if v1.0.0
Downloaded icu_locid_transform v1.5.0
Downloaded heapless v0.8.0
Downloaded gix-refspec v0.31.0
Downloaded gix-odb v0.70.0
Downloaded gix-config-value v0.15.1
Downloaded gix-commitgraph v0.29.0
Downloaded fraction v0.15.3
Downloaded either v1.11.0
Downloaded anstyle-query v1.0.2
Downloaded anstream v0.6.13
Downloaded gix-packetline v0.19.1
Downloaded gix-hash v0.19.0
Downloaded gix-command v0.6.2
Downloaded gix-chunk v0.4.11
Downloaded digest v0.10.7
Downloaded chacha20 v0.9.1
Downloaded bytecount v0.6.8
Downloaded amplify v4.6.0
Downloaded gix-diff v0.53.0
Downloaded gix-credentials v0.30.0
Downloaded email_address v0.2.9
Downloaded colored v2.1.0
Downloaded bitflags v1.3.2
Downloaded git-ref-format v0.5.0
Downloaded blowfish v0.9.1
Downloaded amplify_num v0.5.2
Downloaded ghash v0.5.1
Downloaded chrono v0.4.38
Downloaded gix-fs v0.16.1
Downloaded cyphernet v0.5.2
Downloaded getrandom v0.3.3
Downloaded filetime v0.2.23
Downloaded cbc v0.1.2
Downloaded bit-set v0.8.0
Downloaded amplify_syn v2.0.1
Downloaded gix-url v0.32.0
Downloaded gix-tempfile v18.0.0
Downloaded gix-prompt v0.11.1
Downloaded gix-object v0.50.2
Downloaded gix-date v0.10.5
Downloaded getrandom v0.2.15
Downloaded form_urlencoded v1.2.1
Downloaded fastrand v2.3.0
Downloaded cpufeatures v0.2.12
Downloaded chacha20poly1305 v0.10.1
Downloaded borrow-or-share v0.2.2
Downloaded bit-vec v0.8.0
Downloaded base64ct v1.6.0
Downloaded base16ct v0.2.0
Downloaded backtrace v0.3.75
Downloaded aes v0.8.4
Downloaded clap v4.5.44
Downloaded base64 v0.21.7
Downloaded libz-sys v1.1.16
Downloaded sqlite3-src v0.5.1
Compiling libc v0.2.174
Compiling proc-macro2 v1.0.101
Compiling unicode-ident v1.0.12
Compiling quote v1.0.41
Checking cfg-if v1.0.0
Compiling shlex v1.3.0
Compiling version_check v0.9.4
Checking memchr v2.7.2
Compiling typenum v1.17.0
Checking getrandom v0.2.15
Compiling syn v2.0.106
Compiling generic-array v0.14.7
Compiling jobserver v0.1.31
Checking rand_core v0.6.4
Compiling cc v1.2.2
Compiling serde v1.0.219
Checking aho-corasick v1.1.3
Checking crypto-common v0.1.6
Checking regex-syntax v0.8.5
Checking smallvec v1.15.1
Checking subtle v2.5.0
Checking stable_deref_trait v1.2.0
Checking cpufeatures v0.2.12
Checking once_cell v1.21.3
Compiling parking_lot_core v0.9.12
Checking scopeguard v1.2.0
Checking fastrand v2.3.0
Checking regex-automata v0.4.9
Checking lock_api v0.4.14
Checking block-buffer v0.10.4
Compiling thiserror v2.0.12
Checking digest v0.10.7
Checking parking_lot v0.12.5
Compiling crc32fast v1.5.0
Checking tinyvec_macros v0.1.1
Checking byteorder v1.5.0
Checking tinyvec v1.6.0
Compiling typeid v1.0.3
Checking gix-trace v0.1.13
Checking bitflags v2.9.1
Checking unicode-normalization v0.1.23
Checking home v0.5.9
Compiling synstructure v0.13.1
Checking gix-utils v0.3.0
Checking zlib-rs v0.5.2
Checking bstr v1.12.0
Checking same-file v1.0.6
Compiling serde_derive v1.0.219
Compiling thiserror-impl v2.0.12
Compiling zerofrom-derive v0.1.6
Checking libz-rs-sys v0.5.2
Checking flate2 v1.1.1
Checking walkdir v2.5.0
Compiling yoke-derive v0.7.5
Checking gix-validate v0.10.0
Checking gix-path v0.10.20
Checking zerofrom v0.1.6
Checking prodash v30.0.1
Compiling zerovec-derive v0.10.3
Checking gix-features v0.43.1
Compiling displaydoc v0.2.5
Checking yoke v0.7.5
Checking itoa v1.0.11
Compiling heapless v0.8.0
Checking hash32 v0.3.1
Checking zeroize v1.7.0
Checking zerovec v0.10.4
Checking writeable v0.5.5
Compiling pkg-config v0.3.30
Compiling thiserror v1.0.69
Compiling icu_locid_transform_data v1.5.1
Checking litemap v0.7.5
Checking tinystr v0.7.6
Checking faster-hex v0.10.0
Checking icu_locid v1.5.0
Compiling icu_provider_macros v1.5.0
Compiling thiserror-impl v1.0.69
Compiling rustix v1.0.7
Compiling icu_properties_data v1.5.1
Checking icu_provider v1.5.0
Checking sha1 v0.10.6
Checking block-padding v0.3.3
Checking linux-raw-sys v0.9.4
Compiling icu_normalizer_data v1.5.1
Checking inout v0.1.3
Checking erased-serde v0.4.6
Checking serde_fmt v1.0.3
Checking icu_locid_transform v1.5.0
Checking sha1-checked v0.10.0
Checking value-bag-serde1 v1.11.1
Checking value-bag v1.11.1
Checking icu_collections v1.5.0
Compiling syn v1.0.109
Checking log v0.4.27
Compiling getrandom v0.3.3
Checking icu_properties v1.5.1
Checking gix-hash v0.19.0
Checking cipher v0.4.4
Checking utf8_iter v1.0.4
Checking utf16_iter v1.0.5
Checking write16 v1.0.0
Checking percent-encoding v2.3.1
Checking form_urlencoded v1.2.1
Checking sha2 v0.10.8
Compiling vcpkg v0.2.15
Checking icu_normalizer v1.5.0
Checking universal-hash v0.5.1
Checking idna_adapter v1.2.0
Checking opaque-debug v0.3.1
Compiling libz-sys v1.1.16
Checking idna v1.0.3
Checking tempfile v3.23.0
Compiling autocfg v1.2.0
Checking url v2.5.4
Compiling amplify_syn v2.0.1
Compiling num-traits v0.2.19
Compiling libgit2-sys v0.17.0+1.8.1
Checking signature v1.6.4
Compiling serde_json v1.0.140
Checking equivalent v1.0.1
Checking hashbrown v0.14.3
Checking ed25519 v1.5.3
Checking indexmap v2.2.6
Checking aead v0.5.2
Compiling amplify_derive v4.0.0
Checking ct-codecs v1.1.1
Compiling ref-cast v1.0.24
Checking amplify_num v0.5.2
Checking ryu v1.0.17
Checking ascii v1.1.0
Checking ec25519 v0.1.0
Checking amplify v4.6.0
Checking poly1305 v0.8.0
Checking git-ref-format-core v0.5.0
Checking chacha20 v0.9.1
Compiling ref-cast-impl v1.0.24
Checking cyphergraphy v0.3.0
Checking polyval v0.6.2
Compiling sqlite3-src v0.5.1
Checking hmac v0.12.1
Checking keccak v0.1.5
Checking dyn-clone v1.0.17
Checking base64ct v1.6.0
Checking sha3 v0.10.8
Checking pbkdf2 v0.12.2
Checking pem-rfc7468 v0.7.0
Checking ghash v0.5.1
Checking aes v0.8.4
Checking ctr v0.9.2
Checking rand v0.8.5
Compiling data-encoding v2.5.0
Checking base32 v0.4.0
Compiling crossbeam-utils v0.8.19
Checking cypheraddr v0.4.0
Compiling data-encoding-macro-internal v0.1.12
Checking qcheck v1.0.0
Checking aes-gcm v0.10.3
Checking ssh-encoding v0.2.0
Checking chacha20poly1305 v0.10.1
Checking blowfish v0.9.1
Checking cbc v0.1.2
Compiling serde_derive_internals v0.29.1
Checking data-encoding-macro v0.1.14
Checking bcrypt-pbkdf v0.10.0
Checking ssh-cipher v0.2.0
Checking noise-framework v0.4.0
Checking socks5-client v0.4.1
Compiling schemars_derive v1.0.4
Checking base-x v0.2.11
Checking signature v2.2.0
Checking ssh-key v0.6.6
Checking multibase v0.9.1
Checking crossbeam-channel v0.5.15
Checking schemars v1.0.4
Checking cyphernet v0.5.2
Checking radicle-ssh v0.10.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-ssh)
Checking lazy_static v1.5.0
Checking jiff v0.2.15
Checking nonempty v0.9.0
Checking siphasher v1.0.1
Checking radicle-git-metadata v0.1.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-git-metadata)
Checking radicle-dag v0.10.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-dag)
Checking winnow v0.7.13
Checking anstyle-query v1.0.2
Checking hashbrown v0.15.5
Checking gix-date v0.10.5
Checking gix-hashtable v0.9.0
Checking gix-actor v0.35.4
Checking radicle-git-ref-format v0.1.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-git-ref-format)
Checking base64 v0.21.7
Checking utf8parse v0.2.1
Checking iana-time-zone v0.1.60
Checking anstyle-parse v0.2.3
Checking chrono v0.4.38
Checking gix-object v0.50.2
Checking colored v2.1.0
Checking serde-untagged v0.1.7
Checking localtime v1.3.1
Checking bytesize v2.0.1
Checking memmap2 v0.9.8
Checking fast-glob v0.3.3
Checking tree-sitter-language v0.1.2
Checking dunce v1.0.5
Checking colorchoice v1.0.0
Checking anstyle v1.0.11
Checking gix-chunk v0.4.11
Checking gix-commitgraph v0.29.0
Checking anstream v0.6.13
Checking gix-fs v0.16.1
Checking gix-revwalk v0.21.0
Checking gix-tempfile v18.0.0
Checking mio v1.0.4
Checking gix-quote v0.6.0
Checking sem_safe v0.2.0
Checking errno v0.3.13
Checking shell-words v1.1.0
Checking either v1.11.0
Checking gix-command v0.6.2
Checking signals_receipts v0.2.0
Compiling object v0.36.7
Compiling signal-hook v0.3.18
Checking gix-lock v18.0.0
Checking gix-url v0.32.0
Checking gix-config-value v0.15.1
Checking gix-sec v0.12.0
Checking signal-hook-registry v1.4.5
Compiling rustix v0.38.34
Checking gimli v0.31.1
Checking adler2 v2.0.0
Checking miniz_oxide v0.8.8
Checking gix-prompt v0.11.1
Checking addr2line v0.24.2
Checking radicle-signals v0.11.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-signals)
Checking gix-traverse v0.47.0
Checking gix-revision v0.35.0
Checking gix-diff v0.53.0
Checking mio v0.8.11
Checking gix-packetline v0.19.1
Compiling tree-sitter v0.24.4
Compiling linux-raw-sys v0.4.13
Compiling anyhow v1.0.82
Checking rustc-demangle v0.1.26
Compiling unicode-segmentation v1.11.0
Checking backtrace v0.3.75
Compiling convert_case v0.7.1
Checking sqlite3-sys v0.15.2
Checking sqlite v0.32.0
Checking radicle-crypto v0.14.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-crypto)
Checking gix-transport v0.48.0
Checking signal-hook-mio v0.2.4
Checking gix-pack v0.60.0
Checking gix-refspec v0.31.0
Checking gix-credentials v0.30.0
Checking gix-shallow v0.5.0
Checking gix-ref v0.53.1
Checking gix-negotiate v0.21.0
Compiling maybe-async v0.2.10
Checking regex v1.11.1
Compiling proc-macro-error-attr2 v2.0.0
Compiling portable-atomic v1.11.0
Checking arc-swap v1.7.1
Checking gix-odb v0.70.0
Compiling proc-macro-error2 v2.0.1
Checking gix-protocol v0.51.0
Compiling xattr v1.3.1
Compiling derive_more-impl v2.0.1
Compiling filetime v0.2.23
Checking uuid v1.16.0
Compiling litrs v0.4.1
Checking unicode-width v0.2.1
Checking bytes v1.10.1
Checking bitflags v1.3.2
Checking lexopt v0.3.0
Compiling document-features v0.2.11
Checking crossterm v0.25.0
Checking derive_more v2.0.1
Checking console v0.16.0
Compiling tar v0.4.40
Compiling git-ref-format-macro v0.5.0
Checking newline-converter v0.3.0
Checking snapbox-macros v0.3.8
Checking salsa20 v0.10.2
Checking fxhash v0.2.1
Checking unit-prefix v0.5.1
Checking siphasher v0.3.11
Checking normalize-line-endings v0.3.0
Checking similar v2.5.0
Checking unicode-width v0.1.11
Checking streaming-iterator v0.1.9
Checking inquire v0.7.5
Checking snapbox v0.4.17
Checking bloomy v1.2.0
Checking indicatif v0.18.0
Compiling radicle-surf v0.25.0
Checking scrypt v0.11.0
Checking git-ref-format v0.5.0
Checking crossterm v0.29.0
Checking unicode-display-width v0.3.0
Checking systemd-journal-logger v2.2.2
Checking serde_spanned v1.0.0
Checking toml_datetime v0.7.0
Compiling tree-sitter-css v0.23.1
Compiling tree-sitter-json v0.24.8
Compiling tree-sitter-ruby v0.23.1
Compiling tree-sitter-c v0.23.2
Compiling tree-sitter-rust v0.23.2
Compiling tree-sitter-md v0.3.2
Compiling tree-sitter-html v0.23.2
Compiling tree-sitter-bash v0.23.3
Compiling tree-sitter-typescript v0.23.2
Compiling tree-sitter-go v0.23.4
Compiling tree-sitter-toml-ng v0.6.0
Compiling tree-sitter-python v0.23.4
Checking clap_lex v0.7.5
Checking radicle-std-ext v0.1.1
Compiling heck v0.5.0
Checking toml_writer v1.0.2
Checking pin-project-lite v0.2.16
Checking strsim v0.11.1
Checking toml v0.9.5
Compiling clap_derive v4.5.41
Checking clap_builder v4.5.44
Checking tokio v1.47.1
Checking os_info v3.12.0
Checking diff v0.1.13
Compiling radicle-cli v0.17.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-cli)
Compiling radicle-node v0.16.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-node)
Checking yansi v0.5.1
Checking pretty_assertions v1.4.0
Checking human-panic v2.0.3
Checking structured-logger v1.0.4
Checking clap v4.5.44
Checking radicle-systemd v0.11.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-systemd)
Checking tree-sitter-highlight v0.24.4
Checking itertools v0.14.0
Checking num-integer v0.1.46
Compiling qcheck-macros v1.0.0
Checking socket2 v0.5.7
Checking timeago v0.4.2
Compiling escargot v0.5.10
Checking num-bigint v0.4.6
Compiling ahash v0.8.11
Checking num-iter v0.1.45
Checking num-complex v0.4.6
Checking env_filter v0.1.3
Checking borrow-or-share v0.2.2
Checking zerocopy v0.7.35
Checking num-rational v0.4.2
Checking bit-vec v0.8.0
Checking bit-set v0.8.0
Checking num v0.4.3
Checking fluent-uri v0.3.2
Checking env_logger v0.11.8
Checking phf_shared v0.11.3
Compiling test-log-macros v0.2.18
Compiling radicle-remote-helper v0.14.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-remote-helper)
Checking vsimd v0.8.0
Compiling paste v1.0.15
Checking outref v0.5.2
Checking test-log v0.2.18
Checking referencing v0.30.0
Checking uuid-simd v0.8.0
Checking phf v0.11.3
Checking fraction v0.15.3
Checking fancy-regex v0.14.0
Checking email_address v0.2.9
Checking bytecount v0.6.8
Checking num-cmp v0.1.0
Checking base64 v0.22.1
Checking emojis v0.6.4
Checking jsonschema v0.30.0
Checking git2 v0.19.0
Checking radicle-oid v0.1.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-oid)
Checking radicle-git-ext v0.10.0
Checking radicle-term v0.16.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-term)
Checking radicle-cob v0.17.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-cob)
Checking radicle v0.20.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle)
Checking radicle-fetch v0.16.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-fetch)
Checking radicle-cli-test v0.13.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-cli-test)
error[E0432]: unresolved import `radicle::node::PeerAddrParseError`
--> crates/radicle-cli/src/commands/node/args.rs:11:48
|
11 | use radicle::node::{Address, NodeId, PeerAddr, PeerAddrParseError};
| ^^^^^^^^^^^^^^^^^^ no `PeerAddrParseError` in `node`
Checking radicle-schemars v0.6.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-schemars)
Checking radicle-protocol v0.4.0 (/a8615514-6b21-400d-ac6e-ec66ff40d549/w/crates/radicle-protocol)
For more information about this error, try `rustc --explain E0432`.
error: could not compile `radicle-cli` (lib) due to 1 previous error
warning: build failed, waiting for other jobs to finish...
Exit code: 101
{
"response": "finished",
"result": "failure"
}