Skip to content

Commit e8a9441

Browse files
Use shared actions in TUI write flows
1 parent 5b37f81 commit e8a9441

1 file changed

Lines changed: 54 additions & 28 deletions

File tree

  • crates/tree-ring-memory-cli/src/tui

crates/tree-ring-memory-cli/src/tui/app.rs

Lines changed: 54 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
1-
use std::fs;
21
use std::path::{Component, Path, PathBuf};
32

43
use ratatui::crossterm::event::{KeyCode, KeyEvent, KeyModifiers};
5-
use tree_ring_memory_core::{now_iso, ConsolidationRequest, MemoryEvent, SensitivityGuard};
4+
use tree_ring_memory_core::{now_iso, ConsolidationRequest, MemoryEvent};
65
use tree_ring_memory_sqlite::{MemoryRetriever, RecallResult, SQLiteMemoryStore};
76

87
use crate::integrations::{scan_integrations, IntegrationScanReport};
8+
use crate::actions::export_import::{export_jsonl, ExportActionRequest};
9+
use crate::actions::remember::{remember, RememberRequest};
910

1011
use super::actions::{ActionKind, PendingAction};
1112
use super::input::{parse_slash_command, SlashCommand};
@@ -271,21 +272,18 @@ impl App {
271272
self.status = "remember requires a summary".to_string();
272273
return Ok(());
273274
}
274-
let mut event =
275-
MemoryEvent::new(summary.trim(), "lesson").map_err(|err| err.to_string())?;
276-
event.ring = "cambium".to_string();
277-
event.source.source_type = "manual".to_string();
278-
let guard = SensitivityGuard::default();
279-
let detected = guard
280-
.detect_memory_event_sensitivity(&event)
281-
.map_err(|err| err.to_string())?;
282-
if detected != "normal" {
283-
event.sensitivity = detected;
284-
}
285-
event.validate().map_err(|err| err.to_string())?;
286-
let id = event.id.clone();
287-
self.store.put(&event).map_err(|err| err.to_string())?;
288-
self.status = format!("remembered {id}");
275+
let report = remember(
276+
&mut self.store,
277+
RememberRequest {
278+
summary: summary.trim().to_string(),
279+
event_type: "lesson".to_string(),
280+
ring: "cambium".to_string(),
281+
scope: "project".to_string(),
282+
project: None,
283+
tags: Vec::new(),
284+
},
285+
)?;
286+
self.status = format!("remembered {}", report.memory.id);
289287
self.refresh_store()
290288
}
291289

@@ -371,19 +369,17 @@ impl App {
371369
if output.exists() {
372370
self.status = format!("export refused existing file {}", output.display());
373371
} else {
374-
let (jsonl, report) = self
375-
.store
376-
.export_jsonl(include_sensitive, include_superseded)
377-
.map_err(|err| err.to_string())?;
378-
if let Some(parent) = output.parent() {
379-
if !parent.as_os_str().is_empty() {
380-
fs::create_dir_all(parent).map_err(|err| err.to_string())?;
381-
}
382-
}
383-
fs::write(&output, jsonl).map_err(|err| err.to_string())?;
372+
let report = export_jsonl(
373+
&self.store,
374+
ExportActionRequest {
375+
output: Some(output.clone()),
376+
include_sensitive,
377+
include_superseded,
378+
},
379+
)?;
384380
self.status = format!(
385381
"exported {} memories to {}",
386-
report.memory_count,
382+
report.report.memory_count,
387383
output.display()
388384
);
389385
}
@@ -574,6 +570,21 @@ mod tests {
574570
assert_eq!(app.dashboard.ring("cambium").unwrap().total, 1);
575571
}
576572

573+
#[test]
574+
fn slash_remember_uses_shared_action_and_keeps_status_shape() {
575+
let dir = tempdir().unwrap();
576+
let mut app = app(&dir);
577+
578+
app.execute_slash_command("/remember Use shared TUI remember action")
579+
.unwrap();
580+
581+
assert!(app.status.starts_with("remembered mem_"));
582+
let memories = app.store.list_all(false).unwrap();
583+
assert_eq!(memories.len(), 1);
584+
assert_eq!(memories[0].summary, "Use shared TUI remember action");
585+
assert_eq!(memories[0].ring, "cambium");
586+
}
587+
577588
#[test]
578589
fn secret_like_remember_is_blocked() {
579590
let dir = tempdir().unwrap();
@@ -670,6 +681,21 @@ mod tests {
670681
assert_eq!(app.status, "action cancelled");
671682
}
672683

684+
#[test]
685+
fn confirmed_export_uses_shared_action_and_keeps_default_filters() {
686+
let dir = tempdir().unwrap();
687+
let mut app = app(&dir);
688+
app.execute_slash_command("/remember Export through shared TUI action")
689+
.unwrap();
690+
app.execute_slash_command("/export shared.jsonl").unwrap();
691+
confirm(&mut app);
692+
693+
let output = dir.path().join(".tree-ring/exports/shared.jsonl");
694+
let jsonl = fs::read_to_string(output).unwrap();
695+
assert!(jsonl.contains("tree_ring_memory_export"));
696+
assert!(jsonl.contains("Export through shared TUI action"));
697+
}
698+
673699
#[test]
674700
fn export_path_rejects_parent_dir_in_relative_and_absolute_targets() {
675701
let dir = tempdir().unwrap();

0 commit comments

Comments
 (0)