From ensue-memory
Augmented cognition layer that makes users smarter by connecting conversations to their persistent knowledge tree. Use proactively when topics arise that might have prior knowledge, and when users ask to remember, recall, search, or organize. Triggers on technical discussions, decision-making, project work, "remember this", "recall", "what do I know about", or any knowledge request.
npx claudepluginhub russellpierce/active-fork-ensue-skill --plugin ensue-memoryThis skill uses the workspace's default tool permissions.
A knowledge base for **making the user smarter**. Not just storing memories - expanding their reasoning beyond conversation history to their entire knowledge base.
Guides Next.js Cache Components and Partial Prerendering (PPR) with cacheComponents enabled. Implements 'use cache', cacheLife(), cacheTag(), revalidateTag(), static/dynamic optimization, and cache debugging.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Generates original PNG/PDF visual art via design philosophy manifestos for posters, graphics, and static designs on user request.
A knowledge base for making the user smarter. Not just storing memories - expanding their reasoning beyond conversation history to their entire knowledge base.
Your goal is augmented cognition. The user's intelligence shouldn't reset every conversation. Their knowledge tree persists, grows, and informs every interaction.
You are not just storing data. You are:
Think beyond the conversation. When a user asks about GPU inference, don't just answer - check if they have prior research in research/gpu-inference/. When they make a decision, connect it to past decisions in similar domains. Their knowledge base is an extension of their mind.
Before any write: Does this make them smarter? Will this be useful context in future reasoning? Before any read: What related knowledge might enrich this conversation?
Think of namespaces as categories of thought:
preferences/ → How the user thinks and works
coding/ → Code style, patterns, tools
communication/ → Tone, format, interaction style
projects/ → Active work contexts
acme/ → Project-specific knowledge
architecture/ → Design decisions
conventions/ → Project patterns
research/ → Study areas and learnings
gpu-inference/ → Domain knowledge
distributed-systems/
people/ → Collaborators, contacts
notes/ → Temporal captures
When working within a thought domain, use prefix-based operations to stay focused:
list_keys with prefix: "research/gpu-inference/" → See all knowledge in that branchdiscover_memories scoped to a namespace → Semantic search within a domainThis is especially useful when:
Proactively suggest domain exploration: "Want me to list what's under research/gpu-inference/ to see related notes?"
Don't wait to be asked. When a topic comes up, check the knowledge tree:
| Conversation context | Proactive action |
|---|---|
| User asks about a technical topic | discover_memories for related prior research |
| User is making a decision | Check for past decisions in similar domains |
| User mentions a project | Look for projects/{name}/ context |
| User seems to be continuing prior work | Surface what they stored last time |
Example: User asks "How should I handle caching for this API?"
preferences/architecture/ notes? Past projects/*/caching decisions?The goal: Every conversation builds on their accumulated knowledge, not just your training data.
list_keys with limit 5)Each memory should be:
| Quality | Bad | Good |
|---|---|---|
| Precise | "User likes clean code" | "User prefers early returns over nested conditionals" |
| Granular | Long paragraph of preferences | Single, atomic fact |
| Pointed | "Meeting notes from Tuesday" | "Decision: use PostgreSQL for auth, rationale: team expertise" |
| Actionable | "User is interested in ML" | "User is building inference server, needs <100ms p99 latency" |
Non-limiting: Inform the agent's reasoning, don't constrain it. Store facts, not rules.
Uses $ENSUE_API_KEY env var or .ensue-key file. If missing, user gets a key at https://www.ensue-network.ai/dashboard
$ENSUE_API_KEYecho $([ -d "${CLAUDE_PLUGIN_ROOT}/scripts" ] && echo "${CLAUDE_PLUGIN_ROOT}/scripts" || [ -d "/mnt/skills/user/ensue-memory/scripts" ] && echo "/mnt/skills/user/ensue-memory/scripts" || [ -d "./scripts" ] && echo "./scripts" || echo "")ensue-cli.{script_dir} with the directory you've discovered which jq || (chmod +x {script_dir}/ensue-jq.sh && echo "{script_dir}/.bin/jq") ; remember to use the -r flag when using jq.You'll need to use these discovered pahts for calling the cli and jq.
Use the wrapped CLI to interact with the memory system. Set as executable before use. Use --help to discover commands and usage.
Pipe to jq where relevant to select the information you need. Remember to use the -r flag when interacting with jq.
To run the CLI use that discovered path ensue-cli <method> '<json_args>'
Usage:
ensue-cli list_keys --limit 5
ensue-cli get_memory --key-names '["a"]' # get the key and all associated metadata
ensue-cli get_memory --key-names '["ENTRY_POINT"]' | jq -r '.results[0].value' # get just the value from the key
create_memory, get_memory, and delete_memory all support native batching (1-100 items per call). Use batch calls whenever possible to minimize API roundtrips and save tokens.
Tip: Using HEREDOC syntax (<<'EOF' ... EOF) helps avoid shell escaping issues with complex JSON, especially when values contain quotes, newlines, or special characters.
For example:
ensue-cli create_memory --items "$(cat <<'EOF'
[
{"key_name": "ns/key1", "value": "content1", "description": "First item", "embed": true},
{"key_name": "ns/key2", "value": "content2", "description": "Second item", "embed": true}
]
EOF
)"
CRITICAL: Minimize context window usage. Users may have 100k+ keys. Never dump large lists into the conversation.
Explicit listing requests → Execute directly with list_keys --limit 5 argument to CLI (limit 5):
Vague browsing requests → Ask first, then use discover_memories:
| User says | Action |
|---|---|
| "list recent", "list keys", "show recent" | list_keys with limit 5, offer to show more |
| "what's under X/", "show me the X namespace" | list_keys with prefix, explore the domain |
| "what's on Ensue", "what do I have stored" | Ask what they're looking for first |
| "search for X", "find X" | discover_memories with their query and limit 3 |
Never invent queries. Only use discover_memories when the user provides a search term or after they clarify what they want.
| User says | Action |
|---|---|
| "what can I do", "capabilities", "help" | Steps 1-2 only (summarize tools/list response) |
| "remember...", "save...", "store..." | See Before Creating a Memory above, then create_memory |
| "what was...", "recall...", "get..." | get_memory (exact key) or discover_memories with limit 3 |
| "search for...", "find...", "what do I know about..." | discover_memories with limit 3 (offer to show more) |
| "update...", "change..." | update_memory |
| "delete...", "remove..." | delete_memory ⚠️ |
| "list keys", "list recent", "show recent" | list_keys with limit 5, offer to show more |
| "what's on ensue", "show my memories" | Ask what they're looking for first |
| "check for X", "what's under X", "look in X" | See Namespace vs Key Detection below |
| "share with...", "give access..." | share |
| "revoke access...", "remove user..." | revoke_share ⚠️ |
| "who can access...", "permissions" | list_permissions |
| "notify when...", "subscribe..." | subscribe_to_memory |
When user says "check for X" or provides a pattern, determine intent:
| Pattern looks like... | Action |
|---|---|
Full path with / (e.g., project/config/theme) | get_memory - exact key |
Category-style name (e.g., gpu_inference_study, user-prefs) | Ask: "Do you want to retrieve that key or list what's under that namespace?" |
Ends with / (e.g., sessions/) | list_keys with prefix - explore the domain |
| User says "as prefix", "under", "namespace" | list_keys with prefix |
When ambiguous, ask. Don't assume retrieval vs listing.
For delete_memory and revoke_share: show what will be affected, warn it's permanent, and get user confirmation before executing.
Keep it sparse. When displaying hypergraph results:
Example output:
HG: chess | 20 nodes | 17 edges
Clusters: K(white wins), H(white losses), I(black losses), N(C50 wins)
Only provide analysis, stats, or recommendations when the user asks "what do you think" or similar.