Files
gh-arittr-tabula-scripta/commands/recall.md
2025-11-29 17:58:13 +08:00

12 KiB
Raw Blame History

Recall - Search Existing Memories

Search for existing memory notes in the Obsidian vault and present the top results.

Usage

/recall [query]

Arguments:

  • query - Search terms to find relevant memories (required)

Examples:

/recall git worktrees
/recall debugging race condition
/recall react hooks patterns
/recall authentication flow

Implementation

When this command is invoked:

1. Parse and Validate Query

  1. Parse the query by trimming whitespace from the command input
  2. Validate that the query is not empty
    • If query is empty, return error message: "Query is required. Usage: /recall [query]"

2. Detect Project Context

  1. Attempt to detect the current project from the git repository:
    • Run git rev-parse --show-toplevel to find the git repository root
    • Extract the project name from the repository directory name
  2. If not in a git repository:
    • Fall back to using the current working directory name
    • If that fails, use 'default' as the project name
  3. Store the detected project name for scoped search

3. Attempt Semantic Search (Smart Connections)

Note: Semantic search via Smart Connections plugin is an optional enhancement. If available, it provides better relevance ranking and conceptual matching.

  1. Set initial search method to 'semantic' and initialize empty results array
  2. Attempt to use semantic search (if Smart Connections plugin is installed):
    • Try to perform semantic search across both project notes and global entities
    • Search path: claude/projects/{currentProject}/** and claude/global/**
    • Retrieve top 10 results for ranking
  3. If Smart Connections is not available or fails:
    • Set search method to 'text' for fallback
    • Continue to text search in next step

Implementation Note: Since obsidian-mcp-plugin does not provide native Smart Connections integration, this step may require custom MCP extensions or can be skipped in favor of text search only.

If semantic search was unavailable or returned no results, use text search:

  1. Invoke MCP search_notes operation for project notes:

    • vault: ~/.claude-memory
    • query: The user's search query
    • path_filter: claude/projects/{currentProject}/**
  2. Invoke MCP search_notes operation for global entities:

    • vault: ~/.claude-memory
    • query: The user's search query
    • path_filter: claude/global/entities/**
  3. Combine the project results and global results, removing any duplicates

  4. Set search method to 'text'

  5. Handle errors:

    If MCPUnavailableError:

    • Return graceful degradation message explaining:
      • MCP server is unavailable
      • Steps to restore: ensure Obsidian is running, check plugin installation, verify config
      • Reference to docs/setup-guide.md

    If other error:

    • Return error message with details

5. Rank and Filter Results

  1. Rank results by relevance:

    • If semantic search was used: Results are already ranked by vector similarity
    • If text search was used: Rank by match frequency and recency
      • Calculate match count: How many times the query appears in the result
      • Calculate recency boost: More recent notes ranked higher
      • Combine into relevance score: match count + (recency boost × 10)
      • Sort results by score in descending order
  2. Limit to top 5 results for presentation

  3. Check if no results were found:

    • If results are empty, return info message with:
      • "No memories found for query: '{query}'"
      • Suggestions: Try different terms, use /remember to create memories, search more broadly
      • Current project and search scope information

6. Track Cross-Project Recalls

Use the cross-project tracking patterns defined in the managing-working-memory skill:

  1. Identify cross-project recalls by filtering results:

    • A recall is cross-project if the note's project differs from the current project
    • Exclude global entities (project = 'global') as they're expected to be cross-project
  2. For each cross-project entity recall:

    • Load the current note using MCP read_note
    • Append a new entry to the cross_project_recalls frontmatter array:
      • project: Current project name
      • date: Current date (YYYY-MM-DD)
      • context: "Recalled via search: '{query}'"
    • Update the note using MCP update_note with:
      • Updated cross_project_recalls array
      • Updated claude_last_accessed timestamp
  3. Check if promotion threshold is met:

    • If cross_project_recalls length >= 3, trigger promotion prompt (see below)
    • Promotion prompt is handled by the managing-working-memory skill

Promotion Prompt Format (I4):

When an entity reaches 3 cross-project recalls, display:

I've referenced [[{Entity Name}]] from {source-project} while working on other projects 3 times now:

1. {project-name} ({date}): {context}
2. {project-name} ({date}): {context}
3. {project-name} ({date}): {context}

This pattern seems reusable across projects. Should I promote it to global knowledge?

Options:
1. Yes, promote to global (move to ~/.claude-memory/claude/global/entities/)
2. Remind me later (ask again after 5 cross-project recalls)
3. No, it's project-specific (stop tracking)

What should I do?

User responses:

  • If option 1: Execute promotion process (move entity, update frontmatter, create redirect)
  • If option 2: Continue tracking, increase threshold to 5
  • If option 3: Clear cross_project_recalls array and stop tracking
  1. Handle errors silently:
    • Cross-project tracking is best-effort
    • Log warnings for failed tracking but don't interrupt the search flow

7. Present Results

  1. Format the output message with:

    • Header: "Found {count} {memory/memories} for: '{query}'"
    • Search method used: Semantic or Text search
    • Current project name
    • Blank line
  2. For each result (numbered 1-5):

    • Extract title from path (filename without extension)
    • Get type, project, and updated date from frontmatter
    • Get snippet preview from search result
    • Format as:
      {number}. [[{title}]] ({type})
         Project: {project}
         Updated: {updated}
         Preview: {first 150 chars of snippet}...
      
  3. Add footer with options:

    • "Type a number (1-{count}) to load full note content"
    • "Continue conversation to work with these memories"
    • "Use /remember to create a new memory if nothing matches"
  4. Return the formatted output as a success message

Error Handling

Missing Query

Input: /recall

Output:

Error: Query is required.

Usage: /recall [query]

Examples:
  /recall git worktrees
  /recall debugging race condition
  /recall react hooks patterns

No Results Found

Input: /recall nonexistent topic

Output:

No memories found for query: "nonexistent topic"

Suggestions:
- Try different search terms
- Check if you've created memories for this topic (use /remember)
- Search more broadly (fewer specific terms)

Current project: tabula-scripta
Searched: Project notes + global entities

MCP Unavailable

Input: /recall authentication (when MCP server is down)

Output:

Obsidian MCP server is unavailable. Cannot search memories.

To restore memory features:
1. Ensure Obsidian is running
2. Check obsidian-mcp-plugin is installed in ~/.claude-memory/
3. Verify Claude Code config includes MCP server

See docs/setup-guide.md for troubleshooting.

Success Output

Input: /recall git worktrees

Output:

Found 3 memories for: "git worktrees"
Search method: Semantic (Smart Connections)
Project: tabula-scripta

1. [[Git Worktrees]] (entity)
   Project: tabula-scripta
   Updated: 2025-11-18
   Preview: Git worktrees enable isolated directory trees for parallel development. Each worktree has its own working directory but shares the .git repository...

2. [[Parallel Execution Patterns]] (topic)
   Project: global
   Updated: 2025-11-17
   Preview: Techniques for concurrent task execution including git worktrees, background processes, and isolation strategies...

3. [[2025-11-18 - Spectacular Implementation]] (session)
   Project: tabula-scripta
   Updated: 2025-11-18
   Preview: Implementing parallel phase execution using git worktrees for task isolation. Decision: Use trap handlers for cleanup...


Options:
- Type a number (1-3) to load full note content
- Continue conversation to work with these memories
- Use /remember to create a new memory if nothing matches

Search Scope

The /recall command searches:

  1. Current project notes:

    • claude/projects/{current-project}/sessions/**
    • claude/projects/{current-project}/entities/**
  2. Global entities:

    • claude/global/entities/**
    • claude/global/topics/**
  3. Excludes:

    • Archived sessions (claude/projects/{project}/archive/**)
    • Other project's sessions (unless global)

Semantic Search (Preferred)

Requirements:

  • Smart Connections plugin installed in Obsidian
  • Plugin configured for ~/.claude-memory/ vault

Advantages:

  • Better relevance ranking
  • Finds conceptually similar notes
  • Handles synonyms and related concepts

Example:

  • Query: "concurrency issues"
  • Finds: "Race Condition Debugging", "Parallel Execution Gotchas"

Text Search (Fallback)

When used:

  • Smart Connections not installed
  • Smart Connections unavailable
  • Semantic search fails

Behavior:

  • Exact/fuzzy text matching
  • Ranked by match frequency and recency
  • Still effective for keyword search

Example:

  • Query: "race condition"
  • Finds: Notes containing exact phrase "race condition"

Cross-Project Recall Tracking

When a memory from Project A is recalled while working in Project B:

  1. Silent logging:

    • Update cross_project_recalls frontmatter array
    • No user-visible output (non-intrusive)
  2. Threshold detection:

    • After 3 cross-project recalls
    • Trigger promotion prompt (via managing-working-memory skill)
  3. Context capture:

    cross_project_recalls:
      - project: tabula-scripta
        date: 2025-11-18
        context: "Recalled via search: \"git worktrees\""
      - project: another-project
        date: 2025-11-19
        context: "Recalled via search: \"isolation patterns\""
    

Interactive Follow-Up

After presenting results, user can:

  1. Load full note content:

    • User types: 1
    • Claude loads: Full content of result #1
  2. Continue conversation:

    • User asks: "What did we decide about worktree cleanup?"
    • Claude references loaded memories in response
  3. Create new memory:

    • User types: /remember entity Worktree Cleanup
    • New entity created based on discussion

Relevance Filtering

Results are filtered for relevance:

  • Minimum score threshold: Only include results with score > 0.3
  • Recency boost: Recently updated notes ranked higher
  • Type priority: Entities ranked above sessions (more persistent knowledge)
  • Project scoping: Current project results ranked above cross-project results

Acceptance Criteria

  • Finds notes via semantic search (Smart Connections) when available
  • Falls back to text search when semantic search unavailable
  • Presents top 5 results with relevance ranking
  • Handles MCP unavailable gracefully
  • Detects project context correctly from git repo
  • Tracks cross-project recalls silently
  • Searches both project notes and global entities
  • Shows clear message when no results found
  • Includes note type, project, updated date, and preview in results
  • Offers interactive follow-up options

Integration with managing-working-memory Skill

This command provides the manual interface for memory search. The managing-working-memory skill uses the same search logic for:

  • Proactive recall at session start
  • Finding related entities during updates
  • Cross-project pattern detection

Relationship:

  • /recall - Manual, user-initiated search
  • managing-working-memory - Automatic, skill-driven search
  • Both use same search methods (semantic → text fallback)
  • Both track cross-project recalls