use std::io::Write;
use anyhow::Result;
use clap::Subcommand;
use crate::mcp::BasemindServer;
use crate::mcp::params::*;
use super::render::emit;
use super::run_tool;
#[derive(Subcommand, Debug)]
pub enum GovernanceCmd {
Mine {
#[arg(long)]
window: Option<u32>,
#[arg(long)]
min_support: Option<u32>,
#[arg(long)]
min_confidence: Option<f32>,
#[arg(long)]
max_files_per_commit: Option<u32>,
},
Proposals {
#[arg(long)]
kind: Option<String>,
#[arg(long)]
limit: Option<u32>,
},
Accept {
id: String,
#[arg(long)]
key: Option<String>,
},
Reject {
id: String,
#[arg(long)]
reason: Option<String>,
},
}
pub async fn run(
server: &BasemindServer,
cmd: GovernanceCmd,
json: bool,
out: &mut impl Write,
) -> Result<()> {
match cmd {
GovernanceCmd::Mine {
window,
min_support,
min_confidence,
max_files_per_commit,
} => {
let p = ProposalsMineParams {
window,
min_support,
min_confidence,
max_files_per_commit,
};
let r = run_tool("proposals_mine", server.proposals_mine(Parameters(p)).await)?;
emit("proposals_mine", &r, json, out)
}
GovernanceCmd::Proposals { kind, limit } => {
let p = ProposalsListParams {
kind,
limit,
cursor: None,
};
let r = run_tool("proposals_list", server.proposals_list(Parameters(p)).await)?;
emit("proposals_list", &r, json, out)
}
GovernanceCmd::Accept { id, key } => {
let p = ProposalAcceptParams { id, key };
let r = run_tool(
"proposal_accept",
server.proposal_accept(Parameters(p)).await,
)?;
emit("proposal_accept", &r, json, out)
}
GovernanceCmd::Reject { id, reason } => {
let p = ProposalRejectParams { id, reason };
let r = run_tool(
"proposal_reject",
server.proposal_reject(Parameters(p)).await,
)?;
emit("proposal_reject", &r, json, out)
}
}
}