Initial commit
This commit is contained in:
386
commands/recall.md
Normal file
386
commands/recall.md
Normal file
@@ -0,0 +1,386 @@
|
||||
# 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.
|
||||
|
||||
### 4. Perform Text Search
|
||||
|
||||
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
|
||||
|
||||
4. 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 vs Text Search
|
||||
|
||||
### 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:**
|
||||
```yaml
|
||||
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
|
||||
Reference in New Issue
Block a user