1use clap::{Parser, Subcommand};
2use std::path::PathBuf;
3
4#[derive(Parser)]
5#[command(name = "sparrow", about = "one cli · grows with you", version)]
6pub struct Cli {
7 #[command(subcommand)]
8 pub command: Option<Commands>,
9
10 #[arg(long)]
12 pub tui: bool,
13
14 #[arg(long)]
16 pub web: bool,
17
18 #[arg(long)]
20 pub json: bool,
21
22 #[arg(long)]
24 pub autonomy: Option<String>,
25
26 #[arg(long)]
28 pub model: Option<String>,
29
30 #[arg(long)]
32 pub local: bool,
33
34 #[arg(long)]
36 pub budget: Option<f64>,
37
38 #[arg(long)]
40 pub sandbox: Option<String>,
41
42 #[arg(long)]
44 pub profile: Option<String>,
45
46 #[arg(long)]
48 pub no_checkpoint: bool,
49
50 #[arg(long)]
52 pub agent: Option<String>,
53}
54
55#[derive(Subcommand)]
56pub enum Commands {
57 Run {
59 task: String,
61
62 #[arg(long)]
65 json: bool,
66 },
67
68 Plan {
70 task: String,
72
73 #[arg(long)]
75 json: bool,
76 },
77
78 Chat,
80
81 Tui,
83
84 Launch {
86 #[arg(long, default_value = "9339")]
88 port: u16,
89
90 #[arg(long)]
92 tui: bool,
93 },
94
95 Console {
97 #[arg(long, default_value = "9339")]
99 port: u16,
100 },
101
102 Daemon,
104
105 Agent {
107 #[command(subcommand)]
108 action: AgentAction,
109 },
110
111 Swarm {
113 task: String,
115 },
116
117 Schedule {
119 task: String,
121
122 #[arg(long)]
124 cron: String,
125
126 #[arg(long)]
128 autonomy: Option<String>,
129
130 #[arg(long)]
132 report: Vec<String>,
133 },
134
135 Model {
137 #[arg(long)]
139 set: Option<String>,
140
141 #[arg(long)]
143 list: bool,
144 },
145
146 Route {
148 #[command(subcommand)]
149 action: RouteAction,
150 },
151
152 Auth {
154 #[command(subcommand)]
155 action: AuthAction,
156 },
157
158 Skills {
160 #[command(subcommand)]
161 action: SkillsAction,
162 },
163
164 Plugins {
166 #[command(subcommand)]
167 action: PluginsAction,
168 },
169
170 Tools {
172 #[command(subcommand)]
173 action: ToolsAction,
174 },
175
176 Security {
178 #[command(subcommand)]
179 action: SecurityAction,
180 },
181
182 Github {
184 #[command(subcommand)]
185 action: GithubAction,
186 },
187
188 Compact {
190 #[arg(long)]
192 task: Option<String>,
193 #[arg(long)]
195 out: Option<PathBuf>,
196 #[arg(long)]
198 json: bool,
199 },
200
201 Mcp {
203 #[command(subcommand)]
204 action: McpAction,
205 },
206
207 Checkpoint {
209 #[command(subcommand)]
210 action: CheckpointAction,
211 },
212
213 Rewind {
215 id: String,
217 },
218
219 Replay {
221 run_id: String,
223 #[arg(long)]
225 scrub: bool,
226 },
227
228 Gateway {
230 #[command(subcommand)]
231 action: GatewayAction,
232 },
233
234 Sessions {
236 #[command(subcommand)]
237 action: SessionAction,
238 },
239
240 Learn,
242
243 Init,
245
246 Status,
248
249 Memory {
251 #[command(subcommand)]
252 action: MemoryAction,
253 },
254
255 Permissions {
257 #[command(subcommand)]
258 action: PermissionAction,
259 },
260
261 Profile {
263 #[command(subcommand)]
264 action: ProfileAction,
265 },
266
267 Import {
269 #[command(subcommand)]
270 source: ImportSource,
271 },
272
273 Config {
275 #[arg(short)]
277 edit: bool,
278 },
279
280 Update,
282
283 Doctor,
285
286 Setup,
288
289 Demo,
291
292 Share,
294
295 Hook {
297 #[command(subcommand)]
298 action: HookAction,
299 },
300}
301
302#[derive(Subcommand)]
303pub enum AgentAction {
304 Create { name: String },
305 List,
306 Edit { name: String },
307 Rm { name: String },
308 Run { name: String, task: String },
309 Mention { name: String, message: String },
310}
311
312#[derive(Subcommand)]
313pub enum AuthAction {
314 Add {
315 provider: String,
316 },
317 List,
318 Rm {
319 provider: String,
320 },
321 Login {
323 provider: String,
324 #[arg(long)]
326 client_id: Option<String>,
327 },
328}
329
330#[derive(Subcommand)]
331pub enum SkillsAction {
332 List,
333 View {
334 name: String,
335 },
336 Create {
337 name: String,
338 },
339 Install {
340 source: String,
341 },
342 Update {
343 name: String,
344 },
345 Prune,
346 Rm {
348 name: String,
349 },
350}
351
352#[derive(Subcommand)]
353pub enum PluginsAction {
354 List,
355 Install {
356 source: String,
357 #[arg(long)]
358 allow: bool,
359 },
360 Rm {
361 name: String,
362 },
363}
364
365#[derive(Subcommand)]
366pub enum GithubAction {
367 Review {
369 pr: u64,
371 #[arg(long)]
373 dry_run: bool,
374 #[arg(long)]
376 model: Option<String>,
377 #[arg(long)]
379 allowed_tools: Option<String>,
380 },
381 Status,
383 Logs { run_id: String },
385}
386
387#[derive(Subcommand)]
388pub enum SecurityAction {
389 Audit {
391 #[arg(long)]
393 json: bool,
394 },
395}
396
397#[derive(Subcommand)]
398pub enum ToolsAction {
399 List {
400 #[arg(long)]
401 surface: Option<String>,
402 },
403 Enable {
404 tool: String,
405 },
406 Disable {
407 tool: String,
408 },
409}
410
411#[derive(Subcommand)]
412pub enum McpAction {
413 Add {
414 server: String,
415
416 #[arg(long)]
418 command: Option<String>,
419
420 #[arg(long, value_delimiter = ' ', allow_hyphen_values = true)]
422 args: Vec<String>,
423
424 #[arg(long)]
426 transport: Option<String>,
427 },
428 List,
429 Rm {
430 server: String,
431 },
432}
433
434#[derive(Subcommand)]
435pub enum CheckpointAction {
436 List,
438 Diff {
440 id: String,
442 },
443 Prune {
445 #[arg(long, default_value = "30")]
447 older_than_days: u64,
448 },
449}
450
451#[derive(Subcommand)]
452pub enum GatewayAction {
453 Start,
454 Status,
455 Health,
456 Abort { run: String },
457 Stop,
458}
459
460#[derive(Subcommand)]
461pub enum SessionAction {
462 List,
463 Export {
464 id: String,
465 path: Option<PathBuf>,
466 },
467 Cleanup {
468 #[arg(long, default_value_t = 30)]
469 older_than_days: u64,
470 },
471}
472
473#[derive(Subcommand)]
474pub enum ProfileAction {
475 Create { name: String },
476 List,
477 Use { name: String },
478}
479
480#[derive(Subcommand)]
481pub enum ImportSource {
482 Openclaw { path: Option<PathBuf> },
483}
484
485#[derive(Subcommand)]
486pub enum MemoryAction {
487 List,
488 Forget {
489 id: String,
490 },
491 Add {
492 key: String,
493 value: String,
494 },
495 Replace {
496 id: String,
497 key: String,
498 value: String,
499 },
500 Recall {
501 query: String,
502 #[arg(long, default_value_t = 10)]
503 limit: usize,
504 },
505 Consolidate,
506 Docs,
507 Search {
508 query: String,
509 #[arg(long, default_value_t = 10)]
510 limit: usize,
511 },
512 Scroll {
513 session: String,
514 #[arg(long, default_value_t = 0)]
515 around: usize,
516 #[arg(long, default_value_t = 3)]
517 before: usize,
518 #[arg(long, default_value_t = 3)]
519 after: usize,
520 },
521 Graph {
522 #[command(subcommand)]
523 action: GraphAction,
524 },
525}
526
527#[derive(Subcommand)]
528pub enum GraphAction {
529 UpsertNode {
530 id: String,
531 label: String,
532 #[arg(long, default_value = "entity")]
533 kind: String,
534 #[arg(long, default_value = "{}")]
535 properties: String,
536 },
537 UpsertEdge {
538 from_id: String,
539 relation: String,
540 to_id: String,
541 #[arg(long)]
542 id: Option<String>,
543 #[arg(long, default_value_t = 1.0)]
544 weight: f64,
545 #[arg(long, default_value = "{}")]
546 properties: String,
547 },
548 Get {
549 id: String,
550 },
551 Neighbors {
552 id: String,
553 #[arg(long, default_value = "both")]
554 direction: String,
555 #[arg(long, default_value_t = 20)]
556 limit: usize,
557 },
558 Search {
559 query: String,
560 #[arg(long, default_value_t = 20)]
561 limit: usize,
562 },
563 Export,
564 DeleteNode {
565 id: String,
566 },
567 DeleteEdge {
568 id: String,
569 },
570 SyncNeo4j,
571}
572
573#[derive(Subcommand)]
574pub enum PermissionAction {
575 List,
577 Set { mode: String },
579 AllowTool { tool: String },
581 AskTool { tool: String },
583 DenyTool { tool: String },
585 AllowPath { path: PathBuf },
587 DenyPath { path: PathBuf },
589}
590
591#[derive(Subcommand)]
592pub enum RouteAction {
593 Set {
596 provider: String,
598 },
599 Clear,
601 Show,
603}
604
605#[derive(Subcommand)]
606pub enum HookAction {
607 Install,
609 Scan {
611 #[arg(long)]
613 all: bool,
614 },
615}