lincli 2026.4.16

Linear CLI — manage issues, projects, cycles, and more from the terminal
use crate::client::LinearClient;
use clap::Args;

#[derive(Args, Debug)]
pub struct MeArgs {}

pub async fn execute(
    _args: &MeArgs,
    json: bool,
    debug: bool,
    workspace: Option<&str>,
) -> anyhow::Result<()> {
    let client = LinearClient::new(None, debug, workspace)?;

    let result = client
        .query_raw(
            r#"query {
            viewer {
                id name displayName email active admin
                organization { id name urlKey }
                teamMemberships { nodes { team { key name } } }
            }
        }"#,
            None,
        )
        .await?;

    if json {
        crate::output::print_json(&result);
    } else {
        let viewer = &result["data"]["viewer"];
        let name = viewer
            .get("displayName")
            .or(viewer.get("name"))
            .and_then(|v| v.as_str())
            .unwrap_or("-");
        let email = viewer.get("email").and_then(|v| v.as_str()).unwrap_or("-");
        let org = viewer
            .pointer("/organization/name")
            .and_then(|v| v.as_str())
            .unwrap_or("-");
        let admin = viewer
            .get("admin")
            .and_then(|v| v.as_bool())
            .unwrap_or(false);

        crate::output::detail::print_detail("Name", name, 0);
        crate::output::detail::print_detail("Email", email, 0);
        crate::output::detail::print_detail("Organization", org, 0);
        crate::output::detail::print_detail("Role", if admin { "Admin" } else { "Member" }, 0);

        if let Some(teams) = viewer
            .pointer("/teamMemberships/nodes")
            .and_then(|v| v.as_array())
        {
            let team_list: Vec<&str> = teams
                .iter()
                .filter_map(|t| t.pointer("/team/key").and_then(|v| v.as_str()))
                .collect();
            if !team_list.is_empty() {
                crate::output::detail::print_detail("Teams", &team_list.join(", "), 0);
            }
        }
    }
    Ok(())
}