packc/cli/
publish_agent.rs1use std::path::PathBuf;
2
3use anyhow::{Context, Result, anyhow};
4use clap::Args;
5
6#[derive(Debug, Args)]
7pub struct PublishAgentArgs {
8 #[arg(value_name = "PACK")]
10 pub pack: PathBuf,
11 #[arg(long = "store-url")]
13 pub store_url: Option<String>,
14 #[arg(long = "token")]
16 pub token: Option<String>,
17 #[arg(long = "id")]
19 pub id: String,
20 #[arg(long = "name")]
22 pub name: String,
23 #[arg(long = "version")]
25 pub version: String,
26 #[arg(long = "summary", default_value = "")]
28 pub summary: String,
29}
30
31pub async fn run(args: PublishAgentArgs) -> Result<()> {
32 let store_url = args
33 .store_url
34 .or_else(|| std::env::var("GREENTIC_STORE_URL").ok())
35 .unwrap_or_else(|| "https://store.greentic.cloud".to_string());
36 let token = args
37 .token
38 .or_else(|| std::env::var("GREENTIC_STORE_TOKEN").ok())
39 .ok_or_else(|| anyhow!("missing token: pass --token or set GREENTIC_STORE_TOKEN"))?;
40 let pack_bytes =
41 std::fs::read(&args.pack).with_context(|| format!("read {}", args.pack.display()))?;
42 let metadata = crate::store_client::publish_metadata(
43 &pack_bytes,
44 &args.id,
45 &args.name,
46 &args.version,
47 &args.summary,
48 )?;
49 let resp =
50 crate::store_client::publish_agentic_worker(&store_url, &token, &metadata, pack_bytes)
51 .await?;
52 println!("published: {}", serde_json::to_string_pretty(&resp)?);
53 Ok(())
54}