From 0a1fdd8f1550bd102c72defacea4d218d704eed2 Mon Sep 17 00:00:00 2001 From: phernandez Date: Mon, 24 Mar 2025 17:28:30 -0500 Subject: [PATCH] update docs Signed-off-by: phernandez --- CLAUDE.md | 34 ++++++++++++---------- docs/CLI Reference.md | 30 ++++++++++++++++++- docs/attachments/disk-ai-logo-400x400.png | Bin 0 -> 33616 bytes uv.lock | 23 +++++++-------- 4 files changed, 59 insertions(+), 28 deletions(-) create mode 100644 docs/attachments/disk-ai-logo-400x400.png diff --git a/CLAUDE.md b/CLAUDE.md index b33b75ce..d6b26f5d 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -37,6 +37,7 @@ See the [README.md](README.md) file for a project overview. - API uses FastAPI for endpoints - Follow the repository pattern for data access - Tools communicate to api routers via the httpx ASGI client (in process) +- avoid using "private" functions in modules or classes (prepended with _) ### Codebase Architecture @@ -134,30 +135,32 @@ could achieve independently. ## GitHub Integration -Basic Memory has taken AI-Human collaboration to the next level by integrating Claude directly into the development workflow through GitHub: +Basic Memory uses Claude directly into the development workflow through GitHub: ### GitHub MCP Tools -Using the GitHub Model Context Protocol server, Claude can now: +Using the GitHub Model Context Protocol server, Claude can: - **Repository Management**: - - View repository files and structure - - Read file contents - - Create new branches - - Create and update files + - View repository files and structure + - Read file contents + - Create new branches + - Create and update files - **Issue Management**: - - Create new issues - - Comment on existing issues - - Close and update issues - - Search across issues + - Create new issues + - Comment on existing issues + - Close and update issues + - Search across issues - **Pull Request Workflow**: - - Create pull requests - - Review code changes - - Add comments to PRs + - Create pull requests + - Review code changes + - Add comments to PRs -This integration enables Claude to participate as a full team member in the development process, not just as a code generation tool. Claude's GitHub account ([bm-claudeai](https://github.com/bm-claudeai)) is a member of the Basic Machines organization with direct contributor access to the codebase. +This integration enables Claude to participate as a full team member in the development process, not just as a code +generation tool. Claude's GitHub account ([bm-claudeai](https://github.com/bm-claudeai)) is a member of the Basic +Machines organization with direct contributor access to the codebase. ### Collaborative Development Process @@ -168,4 +171,5 @@ With GitHub integration, the development workflow includes: 3. **Branch management** - Claude can create feature branches for implementations 4. **Documentation maintenance** - Claude can keep documentation updated as the code evolves -This level of integration represents a new paradigm in AI-human collaboration, where the AI assistant becomes a full-fledged team member rather than just a tool for generating code snippets. +With this integration, the AI assistant is a full-fledged team member rather than just a tool for generating code +snippets. \ No newline at end of file diff --git a/docs/CLI Reference.md b/docs/CLI Reference.md index 3cc977e5..20298e80 100644 --- a/docs/CLI Reference.md +++ b/docs/CLI Reference.md @@ -241,10 +241,12 @@ You can redirect input from a file: basic-memory tool write-note --title "Meeting Notes" --folder "meetings" < meeting_notes.md ``` -#### Integration with Claude Code +## Integration with Claude Code This feature works well with Claude Code in the terminal: +### cli + In a Claude Code session, let Claude know he can use the basic-memory tools, then he can execute them via the cli: ``` @@ -257,6 +259,32 @@ In a Claude Code session, let Claude know he can use the basic-memory tools, the ``` +### MCP + +Claude code can also now use mcp tools, so it can use any of the basic-memory tool natively. To install basic-memory in Claude Code: + +Run +``` +claude mcp add basic-memory basic-memory mcp +``` + +For example: + +``` +➜ ~ claude mcp add basic-memory basic-memory mcp +Added stdio MCP server basic-memory with command: basic-memory mcp to project config +➜ ~ claude mcp list +basic-memory: basic-memory mcp +``` + +You can then use the `/mcp` command in the REPL: + +``` +/mcp + ⎿ MCP Server Status + + • basic-memory: connected +``` ## Troubleshooting Common Issues diff --git a/docs/attachments/disk-ai-logo-400x400.png b/docs/attachments/disk-ai-logo-400x400.png new file mode 100644 index 0000000000000000000000000000000000000000..e95d49699a5982c69c93ab35d267bf3cee26bc33 GIT binary patch literal 33616 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 literal 0 HcmV?d00001 diff --git a/uv.lock b/uv.lock index 000cf679..973aae3d 100644 --- a/uv.lock +++ b/uv.lock @@ -1,8 +1,7 @@ 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 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 (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 == 'x86_64' and sys_platform == 'linux'", "platform_machine == 'i686' and sys_platform == 'linux'", "platform_machine == 'aarch64' and sys_platform == 'linux'", @@ -53,7 +52,7 @@ source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "sniffio" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, + { name = "typing-extensions", marker = "python_full_version < '3.13' and python_full_version >= '3.12.1'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a3/73/199a98fc2dae33535d6b8e8e6ec01f8c1d76c9adb096c6b7d64823038cde/anyio-4.8.0.tar.gz", hash = "sha256:1d9fe889df5212298c0c0723fa20479d1b94883a2df44bd3897aa91083316f7a", size = 181126 } wheels = [ @@ -71,7 +70,7 @@ wheels = [ [[package]] name = "basic-memory" -version = "0.9.0" +version = "0.10.0" source = { editable = "." } dependencies = [ { name = "aiosqlite" }, @@ -162,7 +161,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 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 (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')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/fc/97/c783634659c2920c3fc70419e3af40972dbaf758daa229a7d6ea6135c90d/cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824", size = 516621 } wheels = [ @@ -177,7 +176,7 @@ name = "click" version = "8.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "colorama", marker = "platform_system == 'Windows'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b9/2e/0090cbf739cee7d23781ad4b89a9894a41538e4fcf4c31dcdd705b78eb8b/click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a", size = 226593 } wheels = [ @@ -289,8 +288,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 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'" }, + { 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')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b1/17/89c089f4263b6c7f40a69355dd74f2cf5b5a58c4f7db79f76ed3d9e1ca5b/dmgbuild-1.6.4.tar.gz", hash = "sha256:adacada75ee517398d014e3fb250b004a2225f01e54832df52d38b9cd1530b74", size = 36824 } wheels = [ @@ -311,7 +310,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 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')" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7c/36/902259bf7ddb142dd91cf7a9794aa15e1a8ab985974f90375e5d3463b441/ds_store-1.3.1.tar.gz", hash = "sha256:c27d413caf13c19acb85d75da4752673f1f38267f9eb6ba81b3b5aa99c2d207c", size = 27052 } wheels = [ @@ -798,7 +797,7 @@ email = [ { name = "email-validator" }, ] timezone = [ - { name = "tzdata", marker = "sys_platform == 'win32'" }, + { name = "tzdata", marker = "platform_system == 'Windows' and python_full_version >= '3.12.1'" }, ] [[package]] @@ -1192,7 +1191,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') 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 = "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 = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/e4/08/9a90962ea72acd532bda71249a626344d855c4032603924b1b547694b837/sqlalchemy-2.0.38.tar.gz", hash = "sha256:e5a4d82bdb4bf1ac1285a68eab02d253ab73355d9f0fe725a97e1e0fa689decb", size = 9634782 } @@ -1279,7 +1278,7 @@ name = "tzlocal" version = "5.3" source = { registry = "https://pypi.org/simple" } dependencies = [ - { name = "tzdata", marker = "sys_platform == 'win32'" }, + { name = "tzdata", marker = "platform_system == 'Windows'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/33/cc/11360404b20a6340b9b4ed39a3338c4af47bc63f87f6cea94dbcbde07029/tzlocal-5.3.tar.gz", hash = "sha256:2fafbfc07e9d8b49ade18f898d6bcd37ae88ce3ad6486842a2e4f03af68323d2", size = 30480 } wheels = [