remem-ai 0.6.78

Local-first coding agent memory for Claude Code and OpenAI Codex
Documentation
use clap::Subcommand;

#[derive(Subcommand)]
pub(in crate::cli) enum ReviewAction {
    List {
        #[arg(long, short)]
        project: Option<String>,
        #[arg(long, short = 'n', default_value = "20")]
        limit: i64,
    },
    Approve {
        #[arg(long = "acknowledge-pattern")]
        acknowledge_pattern: Option<String>,
        #[arg(long = "acknowledge-dream-review-token")]
        acknowledge_dream_review_token: Option<String>,
        id: i64,
    },
    Discard {
        id: i64,
    },
    Edit {
        id: i64,
        #[arg(long)]
        text: Option<String>,
        #[arg(long = "topic-key")]
        topic_key: Option<String>,
        #[arg(long = "type")]
        memory_type: Option<String>,
        #[arg(long)]
        scope: Option<String>,
    },
    ApproveBatch {
        #[command(flatten)]
        filter: ReviewBatchFilterArgs,
        #[arg(long)]
        yes: bool,
    },
    DiscardBatch {
        #[command(flatten)]
        filter: ReviewBatchFilterArgs,
        #[arg(long)]
        reason: Option<String>,
        #[arg(long)]
        yes: bool,
    },
    Blocked {
        #[arg(long, short)]
        project: Option<String>,
    },
}

#[derive(clap::Args)]
pub(in crate::cli) struct ReviewBatchFilterArgs {
    #[arg(long, short)]
    pub project: Option<String>,
    #[arg(long = "type")]
    pub memory_type: Option<String>,
    #[arg(long = "block-reason")]
    pub block_reason: Option<String>,
    #[arg(long = "topic-key")]
    pub topic_key: Option<String>,
    #[arg(long)]
    pub contains: Option<String>,
    #[arg(long = "min-confidence")]
    pub min_confidence: Option<f64>,
    #[arg(long = "older-than", value_name = "DAYS")]
    pub older_than_days: Option<i64>,
    #[arg(long, short = 'n', default_value = "200")]
    pub limit: i64,
}

#[derive(Subcommand)]
pub(in crate::cli) enum GraphReviewAction {
    List {
        #[arg(long, short)]
        project: Option<String>,
        #[arg(long, short = 'n', default_value = "20")]
        limit: i64,
    },
    Inspect {
        id: i64,
    },
    Approve {
        id: i64,
    },
    Reject {
        id: i64,
        #[arg(long)]
        reason: String,
    },
    Defer {
        id: i64,
        #[arg(long)]
        reason: String,
    },
}

#[cfg(test)]
mod tests {
    use clap::Parser;

    use super::ReviewAction;

    #[derive(Parser)]
    struct ReviewParser {
        #[command(subcommand)]
        action: ReviewAction,
    }

    #[test]
    fn approve_parses_dream_review_token() {
        let parsed = ReviewParser::parse_from([
            "review",
            "approve",
            "--acknowledge-pattern",
            "override_previous_instructions",
            "--acknowledge-dream-review-token",
            "sha256:reviewed",
            "42",
        ]);

        match parsed.action {
            ReviewAction::Approve {
                id,
                acknowledge_pattern,
                acknowledge_dream_review_token,
            } => {
                assert_eq!(id, 42);
                assert_eq!(
                    acknowledge_pattern.as_deref(),
                    Some("override_previous_instructions")
                );
                assert_eq!(
                    acknowledge_dream_review_token.as_deref(),
                    Some("sha256:reviewed")
                );
            }
            _ => panic!("expected approve action"),
        }
    }
}