1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
//! Demonstrates `codex plugin ...` marketplace helpers via the wrapper.
//!
//! Usage:
//! - `cargo run -p unified-agent-api-codex --example plugin_cmd -- root`
//! - `cargo run -p unified-agent-api-codex --example plugin_cmd -- help [COMMAND ...]`
//! - `cargo run -p unified-agent-api-codex --example plugin_cmd -- marketplace`
//! - `cargo run -p unified-agent-api-codex --example plugin_cmd -- marketplace help [COMMAND ...]`
//! - `cargo run -p unified-agent-api-codex --example plugin_cmd -- marketplace add <SOURCE> [--ref <REF>] [--sparse <PATH>]`
//! - `cargo run -p unified-agent-api-codex --example plugin_cmd -- marketplace remove <NAME>`
//! - `cargo run -p unified-agent-api-codex --example plugin_cmd -- marketplace upgrade [NAME]`
//!
//! Environment:
//! - `CODEX_BINARY` (optional): path to the `codex` CLI binary (defaults to `codex` in PATH).
//! - `CODEX_HOME` (optional): Codex home directory for config/auth.
use codex::{
PluginCommandRequest, PluginHelpRequest, PluginMarketplaceAddRequest,
PluginMarketplaceCommandRequest, PluginMarketplaceHelpRequest, PluginMarketplaceRemoveRequest,
PluginMarketplaceUpgradeRequest,
};
#[path = "support/real_cli.rs"]
mod real_cli;
fn usage() {
eprintln!("usage:");
eprintln!(" plugin_cmd root");
eprintln!(" plugin_cmd help [COMMAND ...]");
eprintln!(" plugin_cmd marketplace");
eprintln!(" plugin_cmd marketplace help [COMMAND ...]");
eprintln!(" plugin_cmd marketplace add <SOURCE> [--ref <REF>] [--sparse <PATH>]");
eprintln!(" plugin_cmd marketplace remove <NAME>");
eprintln!(" plugin_cmd marketplace upgrade [NAME]");
}
fn print_output(output: codex::ApplyDiffArtifacts) {
print!("{}", output.stdout);
if !output.stderr.is_empty() {
eprintln!("{}", output.stderr);
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut args: Vec<String> = std::env::args().skip(1).collect();
if args.is_empty() {
usage();
return Ok(());
}
let client = real_cli::default_client();
match args[0].as_str() {
"root" => {
let output = client.plugin(PluginCommandRequest::new()).await?;
print_output(output);
}
"help" => {
let output = client
.plugin_help(PluginHelpRequest::new().command(args.drain(1..)))
.await?;
print_output(output);
}
"marketplace" => {
if args.len() == 1 {
let output = client
.plugin_marketplace(PluginMarketplaceCommandRequest::new())
.await?;
print_output(output);
return Ok(());
}
match args[1].as_str() {
"help" => {
let output = client
.plugin_marketplace_help(
PluginMarketplaceHelpRequest::new().command(args.drain(2..)),
)
.await?;
print_output(output);
}
"add" => {
if args.len() < 3 {
usage();
return Ok(());
}
let mut idx = 2;
let source = args[idx].clone();
idx += 1;
let mut request = PluginMarketplaceAddRequest::new(source);
while idx < args.len() {
match args[idx].as_str() {
"--ref" => {
idx += 1;
if idx >= args.len() {
usage();
return Ok(());
}
request = request.source_ref(args[idx].clone());
}
"--sparse" => {
idx += 1;
if idx >= args.len() {
usage();
return Ok(());
}
request = request.sparse_path(args[idx].clone());
}
_ => {
usage();
return Ok(());
}
}
idx += 1;
}
let output = client.plugin_marketplace_add(request).await?;
print_output(output);
}
"remove" => {
let Some(name) = args.get(2) else {
usage();
return Ok(());
};
let output = client
.plugin_marketplace_remove(PluginMarketplaceRemoveRequest::new(name))
.await?;
print_output(output);
}
"upgrade" => {
let mut request = PluginMarketplaceUpgradeRequest::new();
if let Some(name) = args.get(2) {
request = request.marketplace_name(name.clone());
}
let output = client.plugin_marketplace_upgrade(request).await?;
print_output(output);
}
_ => usage(),
}
}
_ => usage(),
}
Ok(())
}