Skip to main content

packc/cli/
publish_agent.rs

1use std::path::PathBuf;
2
3use anyhow::{Context, Result, anyhow};
4use clap::Args;
5
6#[derive(Debug, Args)]
7pub struct PublishAgentArgs {
8    /// Path to the built dw-application .gtpack.
9    #[arg(value_name = "PACK")]
10    pub pack: PathBuf,
11    /// Store base URL (default: $GREENTIC_STORE_URL or https://store.greentic.cloud).
12    #[arg(long = "store-url")]
13    pub store_url: Option<String>,
14    /// Bearer token (default: $GREENTIC_STORE_TOKEN).
15    #[arg(long = "token")]
16    pub token: Option<String>,
17    /// Store namespace id (e.g. "<handle>.<pack_id>").
18    #[arg(long = "id")]
19    pub id: String,
20    /// Display name.
21    #[arg(long = "name")]
22    pub name: String,
23    /// Version.
24    #[arg(long = "version")]
25    pub version: String,
26    /// One-line summary.
27    #[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}