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 00000000..e95d4969 Binary files /dev/null and b/docs/attachments/disk-ai-logo-400x400.png differ 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 = [