Browse Source

experiment: Add purge command with --all flag

purge removes all messages for current project.
purge --all wipes entire database.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
0xDarkMatter 1 week ago
parent
commit
2cb6d55f28
2 changed files with 41 additions and 0 deletions
  1. 19 0
      skills/agentmail/scripts/mail-db.sh
  2. 22 0
      skills/agentmail/scripts/test-mail.sh

+ 19 - 0
skills/agentmail/scripts/mail-db.sh

@@ -236,6 +236,23 @@ status() {
   fi
 }
 
+# Purge all messages for current project (or all projects with --all)
+purge() {
+  init_db
+  if [ "${1:-}" = "--all" ]; then
+    local count
+    count=$(sqlite3 "$MAIL_DB" "DELETE FROM messages; SELECT changes();")
+    echo "Purged all ${count} message(s) from database"
+  else
+    local project
+    project=$(sql_escape "$(get_project)")
+    local count
+    count=$(sqlite3 "$MAIL_DB" \
+      "DELETE FROM messages WHERE to_project='${project}' OR from_project='${project}'; SELECT changes();")
+    echo "Purged ${count} message(s) for $(get_project)"
+  fi
+}
+
 # Rename a project in all messages (for directory renames/moves)
 alias_project() {
   local old_name="$1"
@@ -279,6 +296,7 @@ case "${1:-help}" in
   broadcast)  broadcast "${2:-no subject}" "${3:?body required}" ;;
   search)     search "${2:?keyword required}" ;;
   status)     status ;;
+  purge)      purge "${2:-}" ;;
   alias)      alias_project "${2:?old name required}" "${3:?new name required}" ;;
   projects)   list_projects ;;
   help)
@@ -297,6 +315,7 @@ case "${1:-help}" in
     echo "  broadcast <subj> <body> Send to all known projects"
     echo "  search <keyword>        Search messages by keyword"
     echo "  status                  Inbox summary"
+    echo "  purge [--all]           Delete all messages for this project"
     echo "  alias <old> <new>       Rename project in all messages"
     echo "  projects                List known projects"
     ;;

+ 22 - 0
skills/agentmail/scripts/test-mail.sh

@@ -490,6 +490,28 @@ rm -f /tmp/agentmail_claude-mods 2>/dev/null
 bash "$MAIL_SCRIPT" read >/dev/null 2>&1
 
 echo ""
+echo "=== Purge ==="
+
+# T54: Purge removes messages for current project
+bash "$MAIL_SCRIPT" send "claude-mods" "purge test 1" "msg1" >/dev/null 2>&1
+bash "$MAIL_SCRIPT" send "claude-mods" "purge test 2" "msg2" >/dev/null 2>&1
+# Insert a message not involving claude-mods at all
+sqlite3 "$MAIL_DB" "INSERT INTO messages (from_project, to_project, subject, body) VALUES ('alpha', 'beta', 'unrelated', 'should survive');"
+result=$(bash "$MAIL_SCRIPT" purge 2>&1)
+assert_contains "purge reports count" "Purged" "$result"
+
+# T55: Unrelated project messages survive purge
+other_count=$(sqlite3 "$MAIL_DB" "SELECT COUNT(*) FROM messages WHERE from_project='alpha';")
+assert "unrelated messages survive purge" "1" "$other_count"
+
+# T56: Purge --all removes everything
+bash "$MAIL_SCRIPT" send "claude-mods" "test" "body" >/dev/null 2>&1
+result=$(bash "$MAIL_SCRIPT" purge --all 2>&1)
+assert_contains "purge --all reports count" "Purged all" "$result"
+total=$(sqlite3 "$MAIL_DB" "SELECT COUNT(*) FROM messages;")
+assert "purge --all empties db" "0" "$total"
+
+echo ""
 echo "=== Per-Project Disable ==="
 
 # T52: Hook respects .claude/agentmail.disable