summaryrefslogtreecommitdiff
path: root/makima/src/daemon/cli
diff options
context:
space:
mode:
authorsoryu <soryu@soryu.co>2026-01-27 03:02:19 +0000
committersoryu <soryu@soryu.co>2026-01-27 03:02:19 +0000
commitf04094966956bc2534b2bab6ee3637c6566daab8 (patch)
tree6a8baf805417b6c272edbc21494e91f70ef37d41 /makima/src/daemon/cli
parent55fb3aaf157f40fe652309ef18016edc7ace6c59 (diff)
downloadsoryu-f04094966956bc2534b2bab6ee3637c6566daab8.tar.gz
soryu-f04094966956bc2534b2bab6ee3637c6566daab8.zip
Add Red Team CLI command and frontend UI
Backend additions: - Add `makima red-team notify` CLI command for red team tasks - Add RedTeamCommand enum with Notify subcommand - Add red_team API client module for notify endpoint - Add RedTeamNotifyArgs with severity, task, file, context options Frontend additions: - Add ContractCreateModal with red team toggle and prompt input - Update ContractDetail with red-team tab for notifications - Update ContractList with red team enabled badge - Add TypeScript types for RedTeamNotification and related interfaces Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'makima/src/daemon/cli')
-rw-r--r--makima/src/daemon/cli/mod.rs57
-rw-r--r--makima/src/daemon/cli/red_team.rs26
2 files changed, 82 insertions, 1 deletions
diff --git a/makima/src/daemon/cli/mod.rs b/makima/src/daemon/cli/mod.rs
index 0805edd..c848e8e 100644
--- a/makima/src/daemon/cli/mod.rs
+++ b/makima/src/daemon/cli/mod.rs
@@ -3,15 +3,18 @@
pub mod config;
pub mod contract;
pub mod daemon;
+pub mod red_team;
pub mod server;
pub mod supervisor;
pub mod view;
-use clap::{Parser, Subcommand};
+use clap::{Args, Parser, Subcommand};
+use uuid::Uuid;
pub use config::CliConfig;
pub use contract::ContractArgs;
pub use daemon::DaemonArgs;
+pub use red_team::handle_notify;
pub use server::ServerArgs;
pub use supervisor::SupervisorArgs;
pub use view::ViewArgs;
@@ -58,6 +61,10 @@ pub enum Commands {
/// Saves configuration to ~/.makima/config.toml for use by CLI commands.
#[command(subcommand)]
Config(ConfigCommand),
+
+ /// Red team commands for adversarial monitoring
+ #[command(name = "red-team", subcommand)]
+ RedTeam(RedTeamCommand),
}
/// Config subcommands for CLI configuration.
@@ -196,6 +203,54 @@ pub enum ContractCommand {
CreateFile(contract::CreateFileArgs),
}
+/// Red team subcommands for adversarial monitoring.
+#[derive(Subcommand, Debug)]
+pub enum RedTeamCommand {
+ /// Send a notification to the supervisor about a detected issue.
+ /// Only available to red team tasks.
+ Notify(RedTeamNotifyArgs),
+}
+
+/// Arguments for red-team notify command.
+#[derive(Args, Debug)]
+pub struct RedTeamNotifyArgs {
+ /// API URL
+ #[arg(long, env = "MAKIMA_API_URL", default_value = "https://api.makima.jp")]
+ pub api_url: String,
+
+ /// API key for authentication
+ #[arg(long, env = "MAKIMA_API_KEY")]
+ pub api_key: String,
+
+ /// Current task ID (must be a red team task)
+ #[arg(long, env = "MAKIMA_TASK_ID")]
+ pub task_id: Uuid,
+
+ /// Contract ID
+ #[arg(long, env = "MAKIMA_CONTRACT_ID")]
+ pub contract_id: Uuid,
+
+ /// The notification message
+ #[arg(index = 1)]
+ pub message: String,
+
+ /// Severity level: low, medium, high, critical
+ #[arg(long, default_value = "medium")]
+ pub severity: String,
+
+ /// Related task ID (optional)
+ #[arg(long)]
+ pub task: Option<Uuid>,
+
+ /// Related file path (optional)
+ #[arg(long)]
+ pub file: Option<String>,
+
+ /// Additional context (optional)
+ #[arg(long)]
+ pub context: Option<String>,
+}
+
impl Cli {
/// Parse command-line arguments
pub fn parse_args() -> Self {
diff --git a/makima/src/daemon/cli/red_team.rs b/makima/src/daemon/cli/red_team.rs
new file mode 100644
index 0000000..771aae4
--- /dev/null
+++ b/makima/src/daemon/cli/red_team.rs
@@ -0,0 +1,26 @@
+//! Red Team subcommand - adversarial review notification commands.
+
+use crate::daemon::api::{ApiClient, RedTeamNotifyRequest};
+use super::RedTeamNotifyArgs;
+
+/// Handle the red-team notify command.
+pub async fn handle_notify(args: RedTeamNotifyArgs) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
+ let client = ApiClient::new(args.api_url, args.api_key)?;
+
+ // Use --task if provided, otherwise fall back to MAKIMA_TASK_ID
+ let related_task_id = args.task;
+
+ let req = RedTeamNotifyRequest {
+ message: args.message,
+ severity: args.severity,
+ related_task_id,
+ file_path: args.file,
+ context: args.context,
+ };
+
+ eprintln!("Sending red team notification...");
+ let result = client.red_team_notify(req).await?;
+ println!("{}", serde_json::to_string(&result.0)?);
+
+ Ok(())
+}