remem-ai 0.6.61

Local-first coding agent memory for Claude Code and OpenAI Codex
Documentation
use super::types::{Cli, Commands, TimelineAction, WorkstreamAction, WorkstreamStatusArg};
use clap::Parser;

#[test]
fn cli_parses_timeline_around_json_filters() {
    let cli = Cli::parse_from([
        "remem",
        "timeline",
        "around",
        "--query",
        "release manifest",
        "--project",
        "/repo",
        "--depth-before",
        "3",
        "--depth-after",
        "4",
        "--json",
    ]);

    match cli.command {
        Commands::Timeline {
            action:
                TimelineAction::Around {
                    anchor,
                    query,
                    project,
                    depth_before,
                    depth_after,
                    json,
                },
        } => {
            assert_eq!(anchor, None);
            assert_eq!(query.as_deref(), Some("release manifest"));
            assert_eq!(project.as_deref(), Some("/repo"));
            assert_eq!(depth_before, 3);
            assert_eq!(depth_after, 4);
            assert!(json);
        }
        _ => panic!("expected timeline around command"),
    }
}

#[test]
fn cli_parses_workstream_update_json_filters() {
    let cli = Cli::parse_from([
        "remem",
        "workstreams",
        "update",
        "42",
        "--project",
        "/repo",
        "--status",
        "paused",
        "--next-action",
        "wait for connector id",
        "--blockers",
        "external registration",
        "--confirm",
        "--json",
    ]);

    match cli.command {
        Commands::Workstreams {
            action:
                WorkstreamAction::Update {
                    id,
                    project,
                    status,
                    next_action,
                    blockers,
                    confirm,
                    json,
                },
        } => {
            assert_eq!(id, 42);
            assert_eq!(project, "/repo");
            assert_eq!(status, Some(WorkstreamStatusArg::Paused));
            assert_eq!(next_action.as_deref(), Some("wait for connector id"));
            assert_eq!(blockers.as_deref(), Some("external registration"));
            assert!(confirm);
            assert!(json);
        }
        _ => panic!("expected workstream update command"),
    }
}

#[test]
fn cli_parses_workstream_merge_json_filters() {
    let cli = Cli::parse_from([
        "remem",
        "workstreams",
        "merge",
        "--project",
        "/repo",
        "--into",
        "42",
        "43",
        "44",
        "--confirm",
        "--json",
    ]);

    match cli.command {
        Commands::Workstreams {
            action:
                WorkstreamAction::Merge {
                    project,
                    into,
                    duplicates,
                    confirm,
                    json,
                },
        } => {
            assert_eq!(project, "/repo");
            assert_eq!(into, 42);
            assert_eq!(duplicates, vec![43, 44]);
            assert!(confirm);
            assert!(json);
        }
        _ => panic!("expected workstream merge command"),
    }
}

#[test]
fn cli_rejects_invalid_workstream_status() {
    let parsed = Cli::try_parse_from([
        "remem",
        "workstreams",
        "update",
        "42",
        "--project",
        "/repo",
        "--status",
        "waiting",
        "--confirm",
        "--json",
    ]);

    assert!(parsed.is_err());
}