Skip to content

Commit 5e9c743

Browse files
authored
Merge pull request #7860 from Extra-Chill/refactor/7516-command-descriptor-remainder
refactor: centralize ops command registrations
2 parents a37b3d2 + 382e629 commit 5e9c743

5 files changed

Lines changed: 87 additions & 70 deletions

File tree

src/command_contract.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
//! variants to discriminators and golden fixtures.
1919
2020
mod constants;
21+
mod descriptors;
2122
mod lab;
2223
mod output;
2324
mod public_variants;
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
//! Declarative registrations for command families migrated off parallel fan-out lists.
2+
3+
/// Expands the Ops command descriptors into a consumer macro.
4+
///
5+
/// Each row owns the command module, parsed Clap variant, contract metadata, and
6+
/// JSON handler binding. Consumers select the fields they need while preserving
7+
/// command-owned dynamic output and Lab predicates.
8+
#[macro_export]
9+
macro_rules! ops_command_descriptors {
10+
($consumer:ident) => {
11+
$consumer! {
12+
(ssh, Ssh, crate::commands::ssh::SshArgs, command_spec("ssh", CommandJsonFamily::Ops), crate::commands::ssh::run),
13+
(server, Server, crate::commands::server::ServerArgs, CommandSpec { subcommand_safety: SERVER_SUBCOMMAND_SAFETY, ..command_spec("server", CommandJsonFamily::Ops) }, crate::commands::server::run),
14+
(db, Db, crate::commands::db::DbArgs, command_spec("db", CommandJsonFamily::Ops), crate::commands::db::run),
15+
(file, File, crate::commands::file::FileArgs, CommandSpec { subcommand_safety: FILE_SUBCOMMAND_SAFETY, ..command_spec("file", CommandJsonFamily::Ops) }, crate::commands::file::run),
16+
(logs, Logs, crate::commands::logs::LogsArgs, command_spec("logs", CommandJsonFamily::Ops), crate::commands::logs::run),
17+
(triage, Triage, crate::commands::triage::TriageArgs, command_spec_with_safety("triage", CommandJsonFamily::Ops, operator_safety(None, TRIAGE_DANGEROUS_FLAGS)), crate::commands::triage::run),
18+
(deploy, Deploy, crate::commands::deploy::DeployArgs, command_spec_with_safety("deploy", CommandJsonFamily::Ops, operator_safety(Some("--dry-run"), DEPLOY_DANGEROUS_FLAGS)), crate::commands::deploy::run),
19+
(daemon, Daemon, crate::commands::daemon::DaemonArgs, command_spec("daemon", CommandJsonFamily::Ops), crate::commands::daemon::run),
20+
(status, Status, crate::commands::status::StatusArgs, command_spec("status", CommandJsonFamily::Ops), crate::commands::status::run),
21+
(git, Git, crate::commands::git::GitArgs, command_spec("git", CommandJsonFamily::Ops), crate::commands::git::run),
22+
(self_cmd, SelfCmd, crate::commands::self_cmd::SelfArgs, command_spec_with_output_notes("self", CommandJsonFamily::Ops, "inspects the active Homeboy runtime and renders built-in CLI documentation"), crate::commands::self_cmd::run),
23+
(api, Api, crate::commands::api::ApiArgs, CommandSpec { subcommand_safety: API_SUBCOMMAND_SAFETY, ..command_spec("api", CommandJsonFamily::Ops) }, crate::commands::api::run),
24+
(upgrade, Upgrade, crate::commands::upgrade::UpgradeArgs, command_spec_with_output_notes_and_safety("upgrade", CommandJsonFamily::Ops, "upgrades the active Homeboy binary, extensions, runners, and services unless --check or skip flags are used", operator_safety(None, UPGRADE_DANGEROUS_FLAGS)), crate::commands::upgrade::run),
25+
}
26+
};
27+
}
28+
29+
#[macro_export]
30+
macro_rules! ops_command_descriptor {
31+
(ssh, $consumer:ident) => { $consumer!((ssh, Ssh, crate::commands::ssh::SshArgs, command_spec("ssh", CommandJsonFamily::Ops), crate::commands::ssh::run)) };
32+
(server, $consumer:ident) => { $consumer!((server, Server, crate::commands::server::ServerArgs, CommandSpec { subcommand_safety: SERVER_SUBCOMMAND_SAFETY, ..command_spec("server", CommandJsonFamily::Ops) }, crate::commands::server::run)) };
33+
(db, $consumer:ident) => { $consumer!((db, Db, crate::commands::db::DbArgs, command_spec("db", CommandJsonFamily::Ops), crate::commands::db::run)) };
34+
(file, $consumer:ident) => { $consumer!((file, File, crate::commands::file::FileArgs, CommandSpec { subcommand_safety: FILE_SUBCOMMAND_SAFETY, ..command_spec("file", CommandJsonFamily::Ops) }, crate::commands::file::run)) };
35+
(logs, $consumer:ident) => { $consumer!((logs, Logs, crate::commands::logs::LogsArgs, command_spec("logs", CommandJsonFamily::Ops), crate::commands::logs::run)) };
36+
(triage, $consumer:ident) => { $consumer!((triage, Triage, crate::commands::triage::TriageArgs, command_spec_with_safety("triage", CommandJsonFamily::Ops, operator_safety(None, TRIAGE_DANGEROUS_FLAGS)), crate::commands::triage::run)) };
37+
(deploy, $consumer:ident) => { $consumer!((deploy, Deploy, crate::commands::deploy::DeployArgs, command_spec_with_safety("deploy", CommandJsonFamily::Ops, operator_safety(Some("--dry-run"), DEPLOY_DANGEROUS_FLAGS)), crate::commands::deploy::run)) };
38+
(daemon, $consumer:ident) => { $consumer!((daemon, Daemon, crate::commands::daemon::DaemonArgs, command_spec("daemon", CommandJsonFamily::Ops), crate::commands::daemon::run)) };
39+
(status, $consumer:ident) => { $consumer!((status, Status, crate::commands::status::StatusArgs, command_spec("status", CommandJsonFamily::Ops), crate::commands::status::run)) };
40+
(git, $consumer:ident) => { $consumer!((git, Git, crate::commands::git::GitArgs, command_spec("git", CommandJsonFamily::Ops), crate::commands::git::run)) };
41+
(self_cmd, $consumer:ident) => { $consumer!((self_cmd, SelfCmd, crate::commands::self_cmd::SelfArgs, command_spec_with_output_notes("self", CommandJsonFamily::Ops, "inspects the active Homeboy runtime and renders built-in CLI documentation"), crate::commands::self_cmd::run)) };
42+
(api, $consumer:ident) => { $consumer!((api, Api, crate::commands::api::ApiArgs, CommandSpec { subcommand_safety: API_SUBCOMMAND_SAFETY, ..command_spec("api", CommandJsonFamily::Ops) }, crate::commands::api::run)) };
43+
(upgrade, $consumer:ident) => { $consumer!((upgrade, Upgrade, crate::commands::upgrade::UpgradeArgs, command_spec_with_output_notes_and_safety("upgrade", CommandJsonFamily::Ops, "upgrades the active Homeboy binary, extensions, runners, and services unless --check or skip flags are used", operator_safety(None, UPGRADE_DANGEROUS_FLAGS)), crate::commands::upgrade::run)) };
44+
}

src/command_contract/spec.rs

Lines changed: 19 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -585,6 +585,12 @@ const COMPONENT_SUBCOMMAND_SAFETY: &[CommandPathSafetySpec] = &[
585585
),
586586
];
587587

588+
macro_rules! registered_ops_spec {
589+
(($module:ident, $variant:ident, $args:path, $spec:expr, $handler:path)) => {
590+
$spec
591+
};
592+
}
593+
588594
pub const COMMAND_SPECS: &[CommandSpec] = &[
589595
CommandSpec {
590596
output_notes: "unified active/recent activity read model in the standard JSON envelope",
@@ -605,11 +611,8 @@ pub const COMMAND_SPECS: &[CommandSpec] = &[
605611
subcommand_safety: PROJECT_SUBCOMMAND_SAFETY,
606612
..command_spec("project", CommandJsonFamily::Workspace)
607613
},
608-
command_spec("ssh", CommandJsonFamily::Ops),
609-
CommandSpec {
610-
subcommand_safety: SERVER_SUBCOMMAND_SAFETY,
611-
..command_spec("server", CommandJsonFamily::Ops)
612-
},
614+
crate::ops_command_descriptor!(ssh, registered_ops_spec),
615+
crate::ops_command_descriptor!(server, registered_ops_spec),
613616
command_spec_with_representative_argv(
614617
&["homeboy", "bench"],
615618
lab_command_spec_with_summary(
@@ -645,30 +648,19 @@ pub const COMMAND_SPECS: &[CommandSpec] = &[
645648
)
646649
},
647650
command_spec("observe", CommandJsonFamily::Quality),
648-
command_spec("db", CommandJsonFamily::Ops),
651+
crate::ops_command_descriptor!(db, registered_ops_spec),
649652
CommandSpec {
650653
subcommand_safety: DEPS_SUBCOMMAND_SAFETY,
651654
..command_spec("deps", CommandJsonFamily::Ops)
652655
},
653-
CommandSpec {
654-
subcommand_safety: FILE_SUBCOMMAND_SAFETY,
655-
..command_spec("file", CommandJsonFamily::Ops)
656-
},
656+
crate::ops_command_descriptor!(file, registered_ops_spec),
657657
CommandSpec {
658658
subcommand_safety: FLEET_SUBCOMMAND_SAFETY,
659659
..command_spec("fleet", CommandJsonFamily::Ops)
660660
},
661-
command_spec("logs", CommandJsonFamily::Ops),
662-
command_spec_with_safety(
663-
"triage",
664-
CommandJsonFamily::Ops,
665-
operator_safety(None, TRIAGE_DANGEROUS_FLAGS),
666-
),
667-
command_spec_with_safety(
668-
"deploy",
669-
CommandJsonFamily::Ops,
670-
operator_safety(Some("--dry-run"), DEPLOY_DANGEROUS_FLAGS),
671-
),
661+
crate::ops_command_descriptor!(logs, registered_ops_spec),
662+
crate::ops_command_descriptor!(triage, registered_ops_spec),
663+
crate::ops_command_descriptor!(deploy, registered_ops_spec),
672664
CommandSpec {
673665
subcommand_safety: COMPONENT_SUBCOMMAND_SAFETY,
674666
..command_spec("component", CommandJsonFamily::Workspace)
@@ -682,7 +674,7 @@ pub const COMMAND_SPECS: &[CommandSpec] = &[
682674
CommandJsonFamily::Workspace,
683675
"lists, shows, exports constants, exports schemas, validates, normalizes, and emits Homeboy-owned contract metadata and command manifests through the central contract surface",
684676
),
685-
command_spec("daemon", CommandJsonFamily::Ops),
677+
crate::ops_command_descriptor!(daemon, registered_ops_spec),
686678
command_spec_with_representative_argv(
687679
&["homeboy", "extension", "refresh", "."],
688680
lab_command_spec_with_summary(
@@ -692,7 +684,7 @@ pub const COMMAND_SPECS: &[CommandSpec] = &[
692684
EXTENSION_LAB_SUPPORT,
693685
),
694686
),
695-
command_spec("status", CommandJsonFamily::Ops),
687+
crate::ops_command_descriptor!(status, registered_ops_spec),
696688
command_spec_with_output_notes_and_safety(
697689
"cleanup",
698690
CommandJsonFamily::Workspace,
@@ -705,7 +697,7 @@ pub const COMMAND_SPECS: &[CommandSpec] = &[
705697
dangerous_flags: CLEANUP_DANGEROUS_FLAGS,
706698
},
707699
),
708-
command_spec("git", CommandJsonFamily::Ops),
700+
crate::ops_command_descriptor!(git, registered_ops_spec),
709701
command_spec_with_output_notes_and_safety(
710702
"release",
711703
CommandJsonFamily::Workspace,
@@ -798,22 +790,10 @@ pub const COMMAND_SPECS: &[CommandSpec] = &[
798790
CommandJsonFamily::Workspace,
799791
"inspects persisted evidence, artifacts, artifact postprocessing, and finding reconciliation workflows",
800792
),
801-
command_spec_with_output_notes(
802-
"self",
803-
CommandJsonFamily::Ops,
804-
"inspects the active Homeboy runtime and renders built-in CLI documentation",
805-
),
793+
crate::ops_command_descriptor!(self_cmd, registered_ops_spec),
806794
command_spec("stack", CommandJsonFamily::Workspace),
807-
CommandSpec {
808-
subcommand_safety: API_SUBCOMMAND_SAFETY,
809-
..command_spec("api", CommandJsonFamily::Ops)
810-
},
811-
command_spec_with_output_notes_and_safety(
812-
"upgrade",
813-
CommandJsonFamily::Ops,
814-
"upgrades the active Homeboy binary, extensions, runners, and services unless --check or skip flags are used",
815-
operator_safety(None, UPGRADE_DANGEROUS_FLAGS),
816-
),
795+
crate::ops_command_descriptor!(api, registered_ops_spec),
796+
crate::ops_command_descriptor!(upgrade, registered_ops_spec),
817797
];
818798

819799
pub const COMMAND_DOC_REGISTRY: &[CommandDocSpec] = &[

src/commands/json_output/ops.rs

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,24 @@
11
use crate::cli_surface::Commands;
22

33
use super::{map, JsonRun};
4-
use crate::commands::{
5-
api, daemon, db, deploy, file, git, logs, self_cmd, server, ssh, status, triage, upgrade,
6-
GlobalArgs,
7-
};
4+
use crate::commands::GlobalArgs;
85

96
pub(super) fn dispatch(command: Commands, global: &GlobalArgs) -> JsonRun {
107
match command {
11-
Commands::Status(args) => map(status::run(args, global)),
12-
Commands::Ssh(args) => map(ssh::run(args, global)),
13-
Commands::Server(args) => map(server::run(args, global)),
14-
Commands::Db(args) => map(db::run(args, global)),
158
Commands::Deps(args) => map(args.run()),
16-
Commands::File(args) => map(file::run(args, global)),
17-
Commands::Logs(args) => map(logs::run(args, global)),
18-
Commands::Triage(args) => map(triage::run(args, global)),
19-
Commands::Deploy(args) => map(deploy::run(args, global)),
20-
Commands::Daemon(args) => map(daemon::run(args, global)),
21-
Commands::Git(args) => map(git::run(args, global)),
22-
Commands::SelfCmd(args) => map(self_cmd::run(args, global)),
23-
Commands::Api(args) => map(api::run(args, global)),
24-
Commands::Upgrade(args) => map(upgrade::run(args, global)),
25-
_ => unreachable!("command routed to wrong JSON output family"),
9+
command => dispatch_registered(command, global),
2610
}
2711
}
12+
13+
fn dispatch_registered(command: Commands, global: &GlobalArgs) -> JsonRun {
14+
macro_rules! registered_ops_dispatch {
15+
($(($module:ident, $variant:ident, $args:path, $spec:expr, $handler:path),)*) => {
16+
match command {
17+
$(Commands::$variant(args) => map($handler(args, global)),)*
18+
_ => unreachable!("command routed to wrong JSON output family"),
19+
}
20+
};
21+
}
22+
23+
crate::ops_command_descriptors!(registered_ops_dispatch)
24+
}

src/commands/mod.rs

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,6 @@ pub mod activity;
205205
pub mod agent_task;
206206
pub(crate) mod agent_task_dispatch;
207207
pub(crate) mod agent_task_summary;
208-
pub mod api;
209208
pub mod artifact_postprocess;
210209
pub mod audit;
211210
pub mod audit_baseline;
@@ -217,19 +216,13 @@ pub mod cleanup;
217216
pub mod component;
218217
pub mod config;
219218
pub mod contract;
220-
pub mod daemon;
221-
pub mod db;
222-
pub mod deploy;
223219
pub mod docs;
224220
pub mod extension;
225-
pub mod file;
226221
pub mod fleet;
227222
pub mod fuzz;
228-
pub mod git;
229223
pub mod issues;
230224
pub mod json_output;
231225
pub mod lint;
232-
pub mod logs;
233226
pub mod observe;
234227
pub mod project;
235228
pub mod raw_output;
@@ -244,20 +237,22 @@ pub mod runner;
244237
pub mod runs;
245238
pub(crate) mod runs_proof_summary;
246239
pub(crate) mod runs_summary;
247-
pub mod self_cmd;
248-
pub mod server;
249-
pub mod ssh;
250240
pub mod stack;
251-
pub mod status;
252241
pub mod test;
253242
pub mod trace;
254-
pub mod triage;
255243
pub mod tunnel;
256244
pub mod undo;
257-
pub mod upgrade;
258245
pub mod utils;
259246
pub mod worktree;
260247

248+
macro_rules! register_ops_command_modules {
249+
($(($module:ident, $variant:ident, $args:path, $spec:expr, $handler:path),)*) => {
250+
$(pub mod $module;)*
251+
};
252+
}
253+
254+
crate::ops_command_descriptors!(register_ops_command_modules);
255+
261256
// Command-runtime infrastructure: the routing, adapter, output/response,
262257
// manifest, and summary plumbing that turns a parsed `Commands` value into a
263258
// dispatched, serialized result. This is a deliberate architectural boundary —

0 commit comments

Comments
 (0)