diff --git a/.gitignore b/.gitignore index f6a6c8ba..30de771a 100644 --- a/.gitignore +++ b/.gitignore @@ -45,4 +45,5 @@ ENV/ /.coverage.* # obsidian docs: -/docs/.obsidian/ \ No newline at end of file +/docs/.obsidian/ +/examples/.obsidian/ \ No newline at end of file diff --git a/docs/.obsidian/app.json b/docs/.obsidian/app.json deleted file mode 100644 index 3dbf4adc..00000000 --- a/docs/.obsidian/app.json +++ /dev/null @@ -1,7 +0,0 @@ -<<<<<<< HEAD -{} -======= -{ - "readableLineLength": false -} ->>>>>>> pre-beta-prep diff --git a/docs/.obsidian/workspace.json b/docs/.obsidian/workspace.json deleted file mode 100644 index 79efe97f..00000000 --- a/docs/.obsidian/workspace.json +++ /dev/null @@ -1,185 +0,0 @@ -{ - "main": { - "id": "9361625269255fc5", - "type": "split", - "children": [ - { - "id": "9220768da355d9a9", - "type": "tabs", - "children": [ - { - "id": "cd58e5dfc86465e3", - "type": "leaf", - "state": { -<<<<<<< HEAD - "type": "empty", - "state": {}, - "icon": "lucide-file", - "title": "New tab" -======= - "type": "markdown", - "state": { - "file": "Getting Started with Basic Memory.md", - "mode": "preview", - "source": false - }, - "icon": "lucide-file", - "title": "Getting Started with Basic Memory" ->>>>>>> pre-beta-prep - } - } - ] - } - ], - "direction": "vertical" - }, - "left": { - "id": "932aa23fccfbb069", - "type": "split", - "children": [ - { - "id": "c60acde475f2bc34", - "type": "tabs", - "children": [ - { - "id": "a06f3217ff27ae41", - "type": "leaf", - "state": { - "type": "file-explorer", - "state": { - "sortOrder": "alphabetical", - "autoReveal": false - }, - "icon": "lucide-folder-closed", - "title": "Files" - } - }, - { - "id": "c338fa22e7339c9a", - "type": "leaf", - "state": { - "type": "search", - "state": { - "query": "", - "matchingCase": false, - "explainSearch": false, - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical" - }, - "icon": "lucide-search", - "title": "Search" - } - }, - { - "id": "56de0827023b2535", - "type": "leaf", - "state": { - "type": "bookmarks", - "state": {}, - "icon": "lucide-bookmark", - "title": "Bookmarks" - } - } - ] - } - ], - "direction": "horizontal", - "width": 300 - }, - "right": { - "id": "c3389d21c08cd71c", - "type": "split", - "children": [ - { - "id": "11a1174f51a1cf86", - "type": "tabs", - "children": [ - { - "id": "bf2a1fb608e63866", - "type": "leaf", - "state": { - "type": "backlink", - "state": { - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical", - "showSearch": false, - "searchQuery": "", - "backlinkCollapsed": false, - "unlinkedCollapsed": true - }, - "icon": "links-coming-in", - "title": "Backlinks" - } - }, - { - "id": "6f08673b57226dc1", - "type": "leaf", - "state": { - "type": "outgoing-link", - "state": { - "linksCollapsed": false, - "unlinkedCollapsed": true - }, - "icon": "links-going-out", - "title": "Outgoing links" - } - }, - { - "id": "e987a9643ca3ec81", - "type": "leaf", - "state": { - "type": "tag", - "state": { - "sortOrder": "frequency", - "useHierarchy": true, - "showSearch": false, - "searchQuery": "" - }, - "icon": "lucide-tags", - "title": "Tags" - } - }, - { - "id": "108a72a022d7e501", - "type": "leaf", - "state": { - "type": "outline", - "state": { - "followCursor": false, - "showSearch": false, - "searchQuery": "" - }, - "icon": "lucide-list", - "title": "Outline" - } - } - ] - } - ], - "direction": "horizontal", - "width": 300, - "collapsed": true - }, - "left-ribbon": { - "hiddenItems": { - "publish:Publish changes...": false, - "switcher:Open quick switcher": false, - "graph:Open graph view": false, - "canvas:Create new canvas": false, - "daily-notes:Open today's daily note": false, - "templates:Insert template": false, - "command-palette:Open command palette": false - } - }, -<<<<<<< HEAD - "active": "a06f3217ff27ae41", - "lastOpenFiles": [] -======= - "active": "cd58e5dfc86465e3", - "lastOpenFiles": [ - "User Guide.md" - ] ->>>>>>> pre-beta-prep -} \ No newline at end of file diff --git a/docs/AI Assistant Guide.md b/docs/AI Assistant Guide.md index 924afc96..b4bf8009 100644 --- a/docs/AI Assistant Guide.md +++ b/docs/AI Assistant Guide.md @@ -3,7 +3,7 @@ title: AI Assistant Guide type: note permalink: docs/ai-assistant-guide --- - +> Note: This is an optional document that can be copy/pasted into the project knowledge for an LLM to provide a full description of how it can work with Basic Memory. It is provided as a helpful resource. The tools contain extensive usage description prompts with enable the LLM to understand them. # AI Assistant Guide for Basic Memory This guide helps you, the AI assistant, use Basic Memory tools effectively when working with users. It covers reading, writing, and navigating knowledge through the Model Context Protocol (MCP). diff --git a/docs/Getting Started with Basic Memory.md b/docs/Getting Started with Basic Memory.md index 33fd7a20..cfbbfcec 100644 --- a/docs/Getting Started with Basic Memory.md +++ b/docs/Getting Started with Basic Memory.md @@ -6,7 +6,10 @@ permalink: docs/getting-started # Getting Started with Basic Memory -This guide will help you install Basic Memory, configure it with Claude Desktop, and create your first knowledge notes through conversations. +This guide will help you install Basic Memory, configure it with Claude Desktop, and create your first knowledge notes +through conversations. + +Basic Memory uses the [Model Context Protol](https://modelcontextprotocol.io/introduction) (MCP) to connect with LLMs. It can be used with any service that supports the MCP, but Claude Desktop works especially well. ## Installation @@ -20,11 +23,13 @@ uv install basic-memory pip install basic-memory ``` -> **Important**: You need to install Basic Memory using one of the commands above to use the command line tools. The `uvx` command mentioned in the Claude Desktop configuration is only for enabling Claude to access Basic Memory. +> **Important**: You need to install Basic Memory using one of the commands above to use the command line tools. The +`uvx` command mentioned in the Claude Desktop configuration is only for enabling Claude to access Basic Memory. ### 2. Configure Claude Desktop -To enable Claude to read and write to your knowledge base, edit the Claude Desktop configuration file (usually at `~/Library/Application Support/Claude/claude_desktop_config.json`): +To enable Claude to read and write to your knowledge base, edit the Claude Desktop configuration file (usually at +`~/Library/Application Support/Claude/claude_desktop_config.json`): ```json { @@ -40,7 +45,7 @@ To enable Claude to read and write to your knowledge base, edit the Claude Deskt } ``` -This configuration uses `uvx` to execute Basic Memory without requiring a full installation in Claude's environment. +> **Note**: This configuration uses `uvx` to execute Basic Memory without requiring a full installation in the system python environment. ### 3. Start the Sync Service @@ -56,6 +61,22 @@ basic-memory sync --watch The `--watch` flag enables automatic detection of file changes, keeping your knowledge base current. +### ### Staying Updated + +To update Basic Memory when new versions are released: + +```bash +# Update with uv +uv tool upgrade basic-memory + +# Or with pip +pip install --upgrade basic-memory` +``` + +We recommend checking for updates periodically, especially after announcements of new releases. + +> **Note**: After updating, you'll need to restart Claude Desktop for it to use the updated version. + ## Creating Your First Knowledge Note 1. **Start a conversation in Claude Desktop** about any topic: @@ -87,6 +108,7 @@ You: "Let's continue our conversation about coffee brewing." ``` This prompt triggers Claude to: + 1. Search your knowledge base for relevant content about coffee brewing 2. Build context from these documents 3. Resume the conversation with full awareness of previous discussions @@ -100,6 +122,7 @@ You: "What have we been discussing recently?" ``` This prompt causes Claude to: + 1. Retrieve documents modified in the recent past 2. Summarize the topics and main points 3. Offer to continue any of those discussions @@ -113,14 +136,13 @@ You: "Find information about pour over coffee methods." ``` Claude will: + 1. Search your knowledge base for relevant documents 2. Summarize the key findings 3. Offer to explore specific documents in more detail -<<<<<<< HEAD -======= See [[User Guide#Using Special Prompts]] for further information. ->>>>>>> pre-beta-prep + ## Using Your Knowledge Base ### Referencing Knowledge @@ -177,4 +199,4 @@ After getting started, explore these areas: 2. **Understand the [[Knowledge Format]]** to learn how knowledge is structured 3. **Set up [[Obsidian Integration]]** for visual knowledge navigation 4. **Learn about [[Canvas]]** visualizations for mapping concepts -5. **Review the [[CLI Reference]]** for command line tools +5. **Review the [[CLI Reference]]** for command line tools \ No newline at end of file diff --git a/docs/Technical Information.md b/docs/Technical Information.md index 10b52ef2..801545fc 100644 --- a/docs/Technical Information.md +++ b/docs/Technical Information.md @@ -62,6 +62,114 @@ Basic Memory is designed with privacy as a core principle: ## Implementation Details +Knowledge in Basic Memory is organized as a semantic graph: + +1. **Entities** - Distinct concepts represented by Markdown documents +2. **Observations** - Categorized facts and information about entities +3. **Relations** - Connections between entities that form the knowledge graph + +This structure emerges from simple text patterns in standard Markdown: + +```markdown +--- +title: Coffee Brewing Methods +type: note +permalink: coffee/coffee-brewing-methods +tags: +- '#coffee' +- '#brewing' +- '#methods' +- '#demo' +--- + +# Coffee Brewing Methods + +An exploration of different coffee brewing techniques, their characteristics, and how they affect flavor extraction. + +## Overview + +Coffee brewing is both an art and a science. Different brewing methods extract different compounds from coffee beans, +resulting in unique flavor profiles, body, and mouthfeel. The key variables in any brewing method are: + +- Grind size +- Water temperature +- Brew time +- Coffee-to-water ratio +- Agitation/turbulence + +## Observations + +- [principle] Coffee extraction follows a predictable pattern: acids extract first, then sugars, then bitter compounds + #extraction +- [method] Pour over methods generally produce cleaner, brighter cups with more distinct flavor notes #clarity + +## Relations + +- requires [[Proper Grinding Technique]] +- affects [[Flavor Extraction]] +``` + +Becomes + +```json +{ + "entities": [ + { + "permalink": "coffee/coffee-brewing-methods", + "title": "Coffee Brewing Methods", + "file_path": "Coffee Notes/Coffee Brewing Methods.md", + "entity_type": "note", + "entity_metadata": { + "title": "Coffee Brewing Methods", + "type": "note", + "permalink": "coffee/coffee-brewing-methods", + "tags": "['#coffee', '#brewing', '#methods', '#demo']" + }, + "checksum": "bfa32a0f23fa124b53f0694c344d2788b0ce50bd090b55b6d738401d2a349e4c", + "content_type": "text/markdown", + "observations": [ + { + "category": "principle", + "content": "Coffee extraction follows a predictable pattern: acids extract first, then sugars, then bitter compounds #extraction", + "tags": [ + "extraction" + ], + "permalink": "coffee/coffee-brewing-methods/observations/principle/coffee-extraction-follows-a-predictable-pattern-acids-extract-first-then-sugars-then-bitter-compounds-extraction" + }, + { + "category": "method", + "content": "Pour over methods generally produce cleaner, brighter cups with more distinct flavor notes #clarity", + "tags": [ + "clarity" + ], + "permalink": "coffee/coffee-brewing-methods/observations/method/pour-over-methods-generally-produce-cleaner-brighter-cups-with-more-distinct-flavor-notes-clarity" + } + ], + "relations": [ + { + "from_id": "coffee/coffee-bean-origins", + "to_id": "coffee/coffee-brewing-methods", + "relation_type": "pairs_with", + "permalink": "coffee/coffee-bean-origins/pairs-with/coffee/coffee-brewing-methods", + "to_name": "Coffee Brewing Methods" + }, + { + "from_id": "coffee/flavor-extraction", + "to_id": "coffee/coffee-brewing-methods", + "relation_type": "affected_by", + "permalink": "coffee/flavor-extraction/affected-by/coffee/coffee-brewing-methods", + "to_name": "Coffee Brewing Methods" + } + ], + "created_at": "2025-03-06T14:01:23.445071", + "updated_at": "2025-03-06T13:34:48.563606" + } + ] +} +``` + +Basic Memory understands how to build context via its semantic graph. + ### Entity Model Basic Memory's core data model consists of: @@ -73,6 +181,42 @@ Basic Memory's core data model consists of: The system parses Markdown files to extract this structured information while preserving the human-readable format. +### Files as Source of Truth + +Plain Markdown files store all knowledge, making it accessible with any text editor and easy to version with git. + +```mermaid +flowchart TD + User((User)) <--> |Conversation| Claude["Claude or other LLM"] + Claude <-->|API Calls| BMCP["Basic Memory MCP Server"] + + subgraph "Local Storage" + KnowledgeFiles["Markdown Files - Source of Truth"] + KnowledgeIndex[(Knowledge Graph SQLite Index)] + end + + BMCP <-->|"write_note() read_note()"| KnowledgeFiles + BMCP <-->|"search() build_context()"| KnowledgeIndex + KnowledgeFiles <-.->|Sync Process| KnowledgeIndex + KnowledgeFiles <-->|Direct Editing| Editors((Text Editors & Git)) + + User -.->|"Complete control, Privacy preserved"| KnowledgeFiles + + + class Claude primary + class BMCP secondary + class KnowledgeFiles tertiary + class KnowledgeIndex quaternary + class User,Editors user`; +``` + +### Sqlite Database + +A local SQLite database maintains the knowledge graph topology for fast queries and semantic traversal without cloud dependencies. It contains: +- db tables for the knowledge graph schema +- a search index table enabling full text search across the knowledge base + + ### Sync Process The sync process: @@ -94,6 +238,6 @@ The search functionality: 5. Ranks results by relevance to the query ## Relations -- relates_to [[Introduction to Basic Memory]] (System overview) +- relates_to [[Welcome to Basic memory]] (Overview) - relates_to [[CLI Reference]] (Command line tools) - implements [[Knowledge Format]] (File structure and format) \ No newline at end of file diff --git a/docs/User Guide.md b/docs/User Guide.md index 1603d9e1..9c90ab28 100644 --- a/docs/User Guide.md +++ b/docs/User Guide.md @@ -6,7 +6,8 @@ permalink: docs/user-guide # User Guide -This guide explains how to effectively use Basic Memory in your daily workflow, from creating knowledge through conversations to building a rich semantic network. +This guide explains how to effectively use Basic Memory in your daily workflow, from creating knowledge through +conversations to building a rich semantic network. ## Basic Memory Workflow @@ -45,7 +46,8 @@ You can create files directly: ## Using Special Prompts -Basic Memory includes several special prompts that help you leverage your knowledge base more effectively. In apps like Claude Desktop, these prompts trigger specific tools to search and analyze your knowledge base. +Basic Memory includes several special prompts that help you leverage your knowledge base more effectively. In apps like +Claude Desktop, these prompts trigger specific tools to search and analyze your knowledge base. ### Continue Conversation @@ -56,6 +58,7 @@ You: Let's continue our conversation about authentication systems. ``` Behind the scenes: + - Claude searches your knowledge base for content about "authentication systems" - It retrieves relevant documents and their relations - It analyzes the context to understand where you left off @@ -63,6 +66,7 @@ Behind the scenes: - It can then resume the conversation with all that context This is particularly useful when: + - Starting a new session days or weeks after your last discussion - Switching between multiple ongoing projects - Building on previous work without repeating yourself @@ -76,12 +80,14 @@ You: What have we been discussing recently? ``` Behind the scenes: + - Claude retrieves documents modified recently - It analyzes patterns and themes - It summarizes the key topics and changes - It offers to continue working on any of those topics This is useful for: + - Coming back after a break - Getting a quick reminder of ongoing projects - Deciding what to work on next @@ -95,19 +101,20 @@ You: Find information about JWT authentication in my notes. ``` Behind the scenes: + - Claude performs a semantic search for "JWT authentication" - It retrieves and ranks the most relevant documents - It summarizes the key findings - It offers to explore specific areas in more detail This is useful for: + - Finding specific information quickly - Exploring what you know about a topic - Starting work on an existing topic ### Example -<<<<<<< HEAD Choose "Continue Conversation" ![[prompt 1.png|500]] @@ -117,9 +124,9 @@ Enter a topic Give instructions ![[prompt3.png|500]] -Claude can build context from the supplied topic. -======= -Claude Desktop lets you send a prompt to provide context. You can use this at the beginning of a chat to preload context without needing to copy paste all the time. By using one of the supplied prompts, Basic Memory will search the knowledge base and give the AI instructions for how to build context. +Claude Desktop lets you send a prompt to provide context. You can use this at the beginning of a chat to preload context +without needing to copy paste all the time. By using one of the supplied prompts, Basic Memory will search the knowledge +base and give the AI instructions for how to build context. Choose "Continue Conversation": @@ -133,12 +140,11 @@ Give optional additional instructions: ![[prompt3.png|500]] -Claude can build context from the supplied topic. This works independently of Claude Project information. All the context comes from your local knowledge base. +Claude can build context from the supplied topic. This works independently of Claude Project information. All the +context comes from your local knowledge base. ->>>>>>> pre-beta-prep ![[prompt4.png|500]] - ## Searching Your Knowledge Base Basic Memory provides multiple ways to search and explore your knowledge base: @@ -161,7 +167,8 @@ Use the dedicated search prompt for more focused searches: You: Search for "JWT authentication" ``` -This triggers a specialized search that returns precise results with document titles, relevant excerpts, and offers to explore specific documents. +This triggers a specialized search that returns precise results with document titles, relevant excerpts, and offers to +explore specific documents. ### Boolean Search @@ -198,6 +205,7 @@ Basic Memory supports standard boolean operators: This finds documents about web development that mention either Python or JavaScript Boolean search is particularly useful for: + - Narrowing down results in large knowledge bases - Finding specific combinations of concepts - Excluding irrelevant content from search results @@ -212,6 +220,7 @@ You: Look at memory://auth* and summarize all authentication approaches. ``` Pattern matching supports: + - **Wildcards**: `memory://auth*` matches all permalinks starting with "auth" - **Path patterns**: `memory://project/*/auth` matches auth documents in any project subfolder - **Relation traversal**: `memory://auth-system/implements/*` finds all documents that implement the auth system @@ -225,6 +234,7 @@ You: Search for JWT authentication and then follow all implementation relations. ``` This builds a complete picture by: + 1. Finding documents about JWT authentication 2. Following implementation relationships from those documents 3. Building a complete picture of how JWT is implemented across your system @@ -232,6 +242,7 @@ This builds a complete picture by: ### Search Best Practices For effective searching: + 1. **Be specific** with search terms and phrases 2. **Use boolean operators** to refine searches and find precise information 3. **Use technical terms** when searching for technical content @@ -292,10 +303,12 @@ permalink: authentication-approaches A comparison of authentication methods. ## Observations + - [approach] JWT provides stateless authentication #security - [limitation] Session tokens require server-side storage #infrastructure ## Relations + - implements [[Security Requirements]] - affects [[User Login Flow]] ``` @@ -319,11 +332,13 @@ When creating or editing notes, build connections: ```markdown ## Relations + - implements [[Security Requirements]] - depends_on [[User Authentication]] ``` Relations can be: + - Hierarchical (part_of, contains) - Directional (implements, depends_on) - Associative (relates_to, similar_to) @@ -445,16 +460,15 @@ basic-memory import claude conversations basic-memory import chatgpt ``` +## Multiple Projects -## Multiple Projects - Basic Memory supports managing multiple separate knowledge bases through projects. This feature allows you to maintain -separate knowledge graphs for different purposes (e.g., personal notes, work projects, research topics). +separate knowledge graphs for different purposes (e.g., personal notes, work projects, research topics). Basic Memory keeps a list of projects in a config file: ` ~/.basic-memory/config.json` - -### Managing Projects - + +### Managing Projects + ```bash # List all configured projects basic-memory project list @@ -471,11 +485,11 @@ basic-memory project remove personal # Show current project basic-memory project current ``` - -### Using Projects in Commands - -All commands support the `--project` flag to specify which project to use: - + +### Using Projects in Commands + +All commands support the `--project` flag to specify which project to use: + ```bash # Sync a specific project basic-memory --project=work sync @@ -483,20 +497,21 @@ basic-memory --project=work sync # Run MCP server for a specific project basic-memory --project=personal mcp ``` - -You can also set the `BASIC_MEMORY_PROJECT` environment variable: - + +You can also set the `BASIC_MEMORY_PROJECT` environment variable: + ```bash BASIC_MEMORY_PROJECT=work basic-memory sync ``` - -### Project Isolation - -Each project maintains: - -- Its own collection of markdown files in the specified directory -- A separate SQLite database for that project + +### Project Isolation + +Each project maintains: + +- Its own collection of markdown files in the specified directory +- A separate SQLite database for that project - Complete knowledge graph isolation from other projects + ## Workflow Tips 1. Run sync in watch mode for automatic updates @@ -512,6 +527,7 @@ Each project maintains: ### Sync Issues If changes aren't showing up: + 1. Verify `basic-memory sync --watch` is running 2. Run `basic-memory status` to check system state 3. Try a manual sync with `basic-memory sync` @@ -519,6 +535,7 @@ If changes aren't showing up: ### Missing Content If content isn't found: + 1. Check the exact path and permalink 2. Try searching with more general terms 3. Verify the file exists in your knowledge base @@ -526,11 +543,13 @@ If content isn't found: ### Relation Problems If relations aren't working: + 1. Ensure exact title matching in [[WikiLinks]] 2. Check for typos in relation types 3. Verify both documents exist ## Relations + - implements [[Knowledge Format]] (How knowledge is structured) - relates_to [[Getting Started with Basic Memory]] (Setup and first steps) - relates_to [[Canvas]] (Creating visual knowledge maps) diff --git a/docs/Welcome to Basic memory.md b/docs/Welcome to Basic memory.md index ef79aa12..afb2f072 100644 --- a/docs/Welcome to Basic memory.md +++ b/docs/Welcome to Basic memory.md @@ -14,8 +14,6 @@ Basic Memory is a knowledge management system that allows you to build a persist with AI assistants. All knowledge is stored in standard Markdown files on your computer, giving you full control and ownership of your data. -## Core Functions - Basic Memory connects you and AI assistants through shared knowledge: 1. **Captures knowledge** from natural conversations with AI assistants @@ -28,130 +26,13 @@ learning environment where each conversation builds upon previous ones. ![[Obsidian-CoffeeKnowledgeBase-examples-overlays.gif]] -## Technical Architecture - Basic Memory uses: - **Files as the source of truth** - Everything is stored in plain Markdown files - **Git-compatible storage** - All knowledge can be versioned, branched, and merged - **Local SQLite database** - For fast indexing and searching only (not primary storage) -- **Memory:// URI scheme** - For precise knowledge referencing and navigation - **Model Context Protocol (MCP)** - For seamless AI assistant integration -## Knowledge Structure - -Knowledge in Basic Memory is organized as a semantic graph: - -1. **Entities** - Distinct concepts represented by Markdown documents -2. **Observations** - Categorized facts and information about entities -3. **Relations** - Connections between entities that form the knowledge graph - -This structure emerges from simple text patterns in standard Markdown: - -```markdown ---- -title: Coffee Brewing Methods -type: note -permalink: coffee/coffee-brewing-methods -tags: -- '#coffee' -- '#brewing' -- '#methods' -- '#demo' ---- - -# Coffee Brewing Methods - -An exploration of different coffee brewing techniques, their characteristics, and how they affect flavor extraction. - -## Overview - -Coffee brewing is both an art and a science. Different brewing methods extract different compounds from coffee beans, -resulting in unique flavor profiles, body, and mouthfeel. The key variables in any brewing method are: - -- Grind size -- Water temperature -- Brew time -- Coffee-to-water ratio -- Agitation/turbulence - -## Observations - -- [principle] Coffee extraction follows a predictable pattern: acids extract first, then sugars, then bitter compounds - #extraction -- [method] Pour over methods generally produce cleaner, brighter cups with more distinct flavor notes #clarity - -## Relations - -- requires [[Proper Grinding Technique]] -- affects [[Flavor Extraction]] -``` - -Becomes - -```json -{ - "entities": [ - { - "permalink": "coffee/coffee-brewing-methods", - "title": "Coffee Brewing Methods", - "file_path": "Coffee Notes/Coffee Brewing Methods.md", - "entity_type": "note", - "entity_metadata": { - "title": "Coffee Brewing Methods", - "type": "note", - "permalink": "coffee/coffee-brewing-methods", - "tags": "['#coffee', '#brewing', '#methods', '#demo']" - }, - "checksum": "bfa32a0f23fa124b53f0694c344d2788b0ce50bd090b55b6d738401d2a349e4c", - "content_type": "text/markdown", - "observations": [ - { - "category": "principle", - "content": "Coffee extraction follows a predictable pattern: acids extract first, then sugars, then bitter compounds #extraction", - "tags": [ - "extraction" - ], - "permalink": "coffee/coffee-brewing-methods/observations/principle/coffee-extraction-follows-a-predictable-pattern-acids-extract-first-then-sugars-then-bitter-compounds-extraction" - }, - { - "category": "method", - "content": "Pour over methods generally produce cleaner, brighter cups with more distinct flavor notes #clarity", - "tags": [ - "clarity" - ], - "permalink": "coffee/coffee-brewing-methods/observations/method/pour-over-methods-generally-produce-cleaner-brighter-cups-with-more-distinct-flavor-notes-clarity" - } - ], - "relations": [ - { - "from_id": "coffee/coffee-bean-origins", - "to_id": "coffee/coffee-brewing-methods", - "relation_type": "pairs_with", - "context": null, - "permalink": "coffee/coffee-bean-origins/pairs-with/coffee/coffee-brewing-methods", - "to_name": "Coffee Brewing Methods" - }, - { - "from_id": "coffee/flavor-extraction", - "to_id": "coffee/coffee-brewing-methods", - "relation_type": "affected_by", - "context": null, - "permalink": "coffee/flavor-extraction/affected-by/coffee/coffee-brewing-methods", - "to_name": "Coffee Brewing Methods" - } - ], - "created_at": "2025-03-06T14:01:23.445071", - "updated_at": "2025-03-06T13:34:48.563606" - } - ] -} -``` - -Basic Memory understands how to build context via its semantic graph. - -## User Control and File Management - Basic Memory gives you complete control over your knowledge: - **Local-first storage** - All knowledge lives on your computer @@ -160,7 +41,7 @@ Basic Memory gives you complete control over your knowledge: - **Version control ready** - Use git for history, branching, and collaboration - **Edit anywhere** - Modify files with any text editor or Obsidian -Changes to files automatically update the knowledge graph, and AI assistants can see your edits in future conversations. +Changes to files automatically sync with the knowledge graph, and AI assistants can see your edits in conversations. ## Documentation Map @@ -169,11 +50,11 @@ Continue exploring Basic Memory with these guides: - Installation and setup [[Getting Started with Basic Memory]] - Comprehensive usage instructions [[User Guide]] - Detailed explanation of knowledge structure [[Knowledge Format]] -- Reference for AI assistants using Basic Memory [[AI Assistant Guide]] -- Technical implementation details [[Technical Information]] -- Command line tool reference [[CLI Reference]] - Obsidian integration guide [[Obsidian Integration]] - Canvas visualization guide [[Canvas]] +- Command line tool reference [[CLI Reference]] +- Reference for AI assistants using Basic Memory [[AI Assistant Guide]] +- Technical implementation details [[Technical Information]] ## Next Steps diff --git a/docs/attachments/disk-ai-logo.png b/docs/attachments/disk-ai-logo.png new file mode 100644 index 00000000..68e83c29 Binary files /dev/null and b/docs/attachments/disk-ai-logo.png differ diff --git a/docs/publish.js b/docs/publish.js new file mode 100644 index 00000000..e7f1f367 --- /dev/null +++ b/docs/publish.js @@ -0,0 +1,5 @@ +var analyticsScript = document.createElement('script'); +analyticsScript.defer = true; +analyticsScript.setAttribute('data-website-id', '8d51086e-5c67-401e-97b0-b24706a6d4f3'); +analyticsScript.src = 'https://cloud.umami.is/script.js'; +document.head.appendChild(analyticsScript); \ No newline at end of file diff --git a/examples/.obsidian/graph.json b/examples/.obsidian/graph.json deleted file mode 100644 index e21a18dc..00000000 --- a/examples/.obsidian/graph.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "collapse-filter": true, - "search": "", - "showTags": false, - "showAttachments": false, - "hideUnresolved": false, - "showOrphans": true, - "collapse-color-groups": true, - "colorGroups": [], - "collapse-display": true, - "showArrow": false, - "textFadeMultiplier": 0, - "nodeSizeMultiplier": 1, - "lineSizeMultiplier": 1, - "collapse-forces": true, - "centerStrength": 0.518713248970312, - "repelStrength": 10, - "linkStrength": 1, - "linkDistance": 250, - "scale": 1, - "close": false -} \ No newline at end of file diff --git a/examples/.obsidian/workspace.json b/examples/.obsidian/workspace.json deleted file mode 100644 index 24979de7..00000000 --- a/examples/.obsidian/workspace.json +++ /dev/null @@ -1,186 +0,0 @@ -{ - "main": { - "id": "7ae5f8d0583c3a18", - "type": "split", - "children": [ - { - "id": "22434516a5f1a19f", - "type": "tabs", - "children": [ - { - "id": "6fae14c14e044a89", - "type": "leaf", - "state": { - "type": "markdown", - "state": { - "file": "Coffee Notes/Coffee Brewing Methods.md", - "mode": "source", - "source": true - }, - "icon": "lucide-file", - "title": "Coffee Brewing Methods" - } - } - ] - } - ], - "direction": "vertical" - }, - "left": { - "id": "402ef826b6e8c27a", - "type": "split", - "children": [ - { - "id": "7df070b9023ec8de", - "type": "tabs", - "children": [ - { - "id": "6fc235d3a84e414f", - "type": "leaf", - "state": { - "type": "file-explorer", - "state": { - "sortOrder": "alphabetical", - "autoReveal": false - }, - "icon": "lucide-folder-closed", - "title": "Files" - } - }, - { - "id": "8679c962d1bfd321", - "type": "leaf", - "state": { - "type": "search", - "state": { - "query": "", - "matchingCase": false, - "explainSearch": false, - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical" - }, - "icon": "lucide-search", - "title": "Search" - } - }, - { - "id": "8848cf5cc01540b2", - "type": "leaf", - "state": { - "type": "bookmarks", - "state": {}, - "icon": "lucide-bookmark", - "title": "Bookmarks" - } - } - ] - } - ], - "direction": "horizontal", - "width": 264.5 - }, - "right": { - "id": "5bfd609e7511200a", - "type": "split", - "children": [ - { - "id": "5b83fb5c13b27ce5", - "type": "tabs", - "children": [ - { - "id": "396b2dfa99a4a44e", - "type": "leaf", - "state": { - "type": "backlink", - "state": { - "file": "Untitled.md", - "collapseAll": false, - "extraContext": false, - "sortOrder": "alphabetical", - "showSearch": false, - "searchQuery": "", - "backlinkCollapsed": false, - "unlinkedCollapsed": true - }, - "icon": "links-coming-in", - "title": "Backlinks for Untitled" - } - }, - { - "id": "b606de8f7f078b60", - "type": "leaf", - "state": { - "type": "outgoing-link", - "state": { - "file": "Untitled.md", - "linksCollapsed": false, - "unlinkedCollapsed": true - }, - "icon": "links-going-out", - "title": "Outgoing links from Untitled" - } - }, - { - "id": "2788e9059ef83663", - "type": "leaf", - "state": { - "type": "tag", - "state": { - "sortOrder": "frequency", - "useHierarchy": true, - "showSearch": false, - "searchQuery": "" - }, - "icon": "lucide-tags", - "title": "Tags" - } - }, - { - "id": "cdf344bf83b2f251", - "type": "leaf", - "state": { - "type": "outline", - "state": { - "file": "Untitled.md", - "followCursor": false, - "showSearch": false, - "searchQuery": "" - }, - "icon": "lucide-list", - "title": "Outline of Untitled" - } - } - ] - } - ], - "direction": "horizontal", - "width": 682.5, - "collapsed": true - }, - "left-ribbon": { - "hiddenItems": { - "switcher:Open quick switcher": false, - "graph:Open graph view": false, - "canvas:Create new canvas": false, - "daily-notes:Open today's daily note": false, - "templates:Insert template": false, - "command-palette:Open command palette": false, - "publish:Publish changes...": false - } - }, - "active": "6fae14c14e044a89", - "lastOpenFiles": [ - "Untitled.md", - "Coffee Notes/Coffee Brewing Methods.md", - "Coffee Notes/Coffee Knowledge Base.md", - "Coffee Notes/Flavor Extraction.md", - "Coffee Notes/Coffee Flavor Map.md", - "Coffee Notes/Coffee Bean Origins.md", - "Coffee Notes/Perfect Pour Over Coffee Method.canvas", - "Coffee Notes/Coffee Brewing Methods Venn Diagram.canvas", - "Coffee Notes/Pour Over Techniques.md", - "Coffee Notes/Tasting Notes.md", - "Coffee Notes/Hybrid Pour Over Technique.md" - ] -} \ No newline at end of file diff --git a/examples/Untitled.md b/examples/Untitled.md deleted file mode 100644 index e69de29b..00000000 diff --git a/src/basic_memory/__init__.py b/src/basic_memory/__init__.py index 67685c01..a1ac1a84 100644 --- a/src/basic_memory/__init__.py +++ b/src/basic_memory/__init__.py @@ -1,7 +1,3 @@ """basic-memory - Local-first knowledge management combining Zettelkasten with knowledge graphs""" -<<<<<<< HEAD -__version__ = "0.9.0" -======= -__version__ = "0.8.0" ->>>>>>> pre-beta-prep +__version__ = "0.9.0" \ No newline at end of file diff --git a/uv.lock b/uv.lock index 34d7537d..000cf679 100644 --- a/uv.lock +++ b/uv.lock @@ -1,7 +1,8 @@ version = 1 +revision = 1 requires-python = ">=3.12.1" resolution-markers = [ - "(platform_machine != 'aarch64' and platform_machine != 'armv7l' and platform_machine != 'i686' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64') or (platform_machine == 'aarch64' and sys_platform != 'linux') or (platform_machine == 'armv7l' and sys_platform != 'linux') or (platform_machine == 'i686' and sys_platform != 'linux') or (platform_machine == 'ppc64le' and sys_platform != 'linux') or (platform_machine == 's390x' and sys_platform != 'linux') or (platform_machine == 'x86_64' and sys_platform != 'linux')", + "(platform_machine != 'aarch64' and platform_machine != 'armv7l' and platform_machine != 'i686' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64') or sys_platform != 'linux'", "platform_machine == 'x86_64' and sys_platform == 'linux'", "platform_machine == 'i686' and sys_platform == 'linux'", "platform_machine == 'aarch64' and sys_platform == 'linux'", @@ -52,7 +53,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "sniffio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13' and python_full_version >= '3.12.1'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } wheels = [ @@ -70,7 +71,7 @@ wheels = [ [[package]] name = "basic-memory" -version = "0.8.0" +version = "0.9.0" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, @@ -161,7 +162,7 @@ name = "cffi" version = "1.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "pycparser", marker = "(platform_machine != 'aarch64' and platform_machine != 'armv7l' and platform_machine != 'i686' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64') or (platform_machine == 'aarch64' and sys_platform != 'linux') or (platform_machine == 'armv7l' and sys_platform != 'linux') or (platform_machine == 'i686' and sys_platform != 'linux') or (platform_machine == 'ppc64le' and sys_platform != 'linux') or (platform_machine == 's390x' and sys_platform != 'linux') or (platform_machine == 'x86_64' and sys_platform != 'linux')" }, + { name = "pycparser", marker = "(platform_machine != 'aarch64' and platform_machine != 'armv7l' and platform_machine != 'i686' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64') or sys_platform != 'linux'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } wheels = [ @@ -176,7 +177,7 @@ name = "click" version = "8.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "platform_system == 'Windows'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } wheels = [ @@ -288,8 +289,8 @@ name = "dmgbuild" version = "1.6.4" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "ds-store", marker = "(platform_machine != 'aarch64' and platform_machine != 'armv7l' and platform_machine != 'i686' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64') or (platform_machine == 'aarch64' and sys_platform != 'linux') or (platform_machine == 'armv7l' and sys_platform != 'linux') or (platform_machine == 'i686' and sys_platform != 'linux') or (platform_machine == 'ppc64le' and sys_platform != 'linux') or (platform_machine == 's390x' and sys_platform != 'linux') or (platform_machine == 'x86_64' and sys_platform != 'linux')" }, - { name = "mac-alias", marker = "(platform_machine != 'aarch64' and platform_machine != 'armv7l' and platform_machine != 'i686' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64') or (platform_machine == 'aarch64' and sys_platform != 'linux') or (platform_machine == 'armv7l' and sys_platform != 'linux') or (platform_machine == 'i686' and sys_platform != 'linux') or (platform_machine == 'ppc64le' and sys_platform != 'linux') or (platform_machine == 's390x' and sys_platform != 'linux') or (platform_machine == 'x86_64' and sys_platform != 'linux')" }, + { name = "ds-store", marker = "(platform_machine != 'aarch64' and platform_machine != 'armv7l' and platform_machine != 'i686' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64') or sys_platform != 'linux'" }, + { name = "mac-alias", marker = "(platform_machine != 'aarch64' and platform_machine != 'armv7l' and platform_machine != 'i686' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64') or sys_platform != 'linux'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b1/17/89c089f4263b6c7f40a69355dd74f2cf5b5a58c4f7db79f76ed3d9e1ca5b/dmgbuild-1.6.4.tar.gz", hash = "sha256:adacada75ee517398d014e3fb250b004a2225f01e54832df52d38b9cd1530b74", size = 36824 } wheels = [ @@ -310,7 +311,7 @@ name = "ds-store" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "mac-alias", marker = "(platform_machine != 'aarch64' and platform_machine != 'armv7l' and platform_machine != 'i686' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64') or (platform_machine == 'aarch64' and sys_platform != 'linux') or (platform_machine == 'armv7l' and sys_platform != 'linux') or (platform_machine == 'i686' and sys_platform != 'linux') or (platform_machine == 'ppc64le' and sys_platform != 'linux') or (platform_machine == 's390x' and sys_platform != 'linux') or (platform_machine == 'x86_64' and sys_platform != 'linux')" }, + { name = "mac-alias", marker = "(platform_machine != 'aarch64' and platform_machine != 'armv7l' and platform_machine != 'i686' and platform_machine != 'ppc64le' and platform_machine != 's390x' and platform_machine != 'x86_64') or sys_platform != 'linux'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7c/36/902259bf7ddb142dd91cf7a9794aa15e1a8ab985974f90375e5d3463b441/ds_store-1.3.1.tar.gz", hash = "sha256:c27d413caf13c19acb85d75da4752673f1f38267f9eb6ba81b3b5aa99c2d207c", size = 27052 } wheels = [ @@ -797,7 +798,7 @@ email = [ { name = "email-validator" }, ] timezone = [ - { name = "tzdata", marker = "platform_system == 'Windows' and python_full_version >= '3.12.1'" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, ] [[package]] @@ -1191,7 +1192,7 @@ name = "sqlalchemy" version = "2.0.38" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64' and python_full_version >= '3.12.1') or (python_full_version < '3.14' and platform_machine == 'WIN32' and python_full_version >= '3.12.1') or (python_full_version < '3.14' and platform_machine == 'aarch64' and python_full_version >= '3.12.1') or (python_full_version < '3.14' and platform_machine == 'amd64' and python_full_version >= '3.12.1') or (python_full_version < '3.14' and platform_machine == 'ppc64le' and python_full_version >= '3.12.1') or (python_full_version < '3.14' and platform_machine == 'win32' and python_full_version >= '3.12.1') or (python_full_version < '3.14' and platform_machine == 'x86_64' and python_full_version >= '3.12.1')" }, + { name = "greenlet", marker = "(python_full_version < '3.14' and platform_machine == 'AMD64') or (python_full_version < '3.14' and platform_machine == 'WIN32') or (python_full_version < '3.14' and platform_machine == 'aarch64') or (python_full_version < '3.14' and platform_machine == 'amd64') or (python_full_version < '3.14' and platform_machine == 'ppc64le') or (python_full_version < '3.14' and platform_machine == 'win32') or (python_full_version < '3.14' and platform_machine == 'x86_64')" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e4/08/9a90962ea72acd532bda71249a626344d855c4032603924b1b547694b837/sqlalchemy-2.0.38.tar.gz", hash = "sha256:e5a4d82bdb4bf1ac1285a68eab02d253ab73355d9f0fe725a97e1e0fa689decb", size = 9634782 } @@ -1278,7 +1279,7 @@ name = "tzlocal" version = "5.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "tzdata", marker = "platform_system == 'Windows'" }, + { name = "tzdata", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/33/cc/11360404b20a6340b9b4ed39a3338c4af47bc63f87f6cea94dbcbde07029/tzlocal-5.3.tar.gz", hash = "sha256:2fafbfc07e9d8b49ade18f898d6bcd37ae88ce3ad6486842a2e4f03af68323d2", size = 30480 } wheels = [