basic-memory 0.13.1__tar.gz → 0.13.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of basic-memory might be problematic. Click here for more details.
- basic_memory-0.13.2/.claude/commands/release/beta.md +95 -0
- basic_memory-0.13.2/.claude/commands/release/release.md +86 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/PKG-INFO +1 -1
- basic_memory-0.13.2/justfile +182 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/__init__.py +4 -1
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/cli/commands/project.py +10 -25
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/project_management.py +7 -5
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/schemas/project_info.py +6 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/services/project_service.py +4 -4
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/cli/test_project_commands.py +1 -4
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/conftest.py +0 -1
- basic_memory-0.13.1/.claude/commands/release/beta.md +0 -69
- basic_memory-0.13.1/.claude/commands/release/release.md +0 -84
- basic_memory-0.13.1/justfile +0 -63
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.claude/commands/check-health.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.claude/commands/commands.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.claude/commands/lint-fix.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.claude/commands/release/changelog.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.claude/commands/release/release-check.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.claude/commands/test-coverage.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.claude/commands/test-live.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.env.oauth.example +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.github/ISSUE_TEMPLATE/bug_report.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.github/ISSUE_TEMPLATE/documentation.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.github/ISSUE_TEMPLATE/feature_request.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.github/dependabot.yml +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.github/workflows/claude.yml +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.github/workflows/dev-release.yml +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.github/workflows/pr-title.yml +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.github/workflows/release.yml +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.github/workflows/test.yml +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.gitignore +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.mcp.json +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/.python-version +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/AUTH.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/CHANGELOG.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/CITATION.cff +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/CLA.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/CLAUDE.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/CODE_OF_CONDUCT.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/CONTRIBUTING.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/Dockerfile +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/LICENSE +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/README.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/SECURITY.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/basic-memory.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/AI Assistant Guide.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/CLI Reference.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/Canvas.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/Claude.ai Integration.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/Getting Started with Basic Memory.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/Knowledge Format.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/OAuth Authentication Guide.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/Obsidian Integration.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/Supabase OAuth Setup.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/Technical Information.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/User Guide.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/Welcome to Basic memory.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/attachments/Canvas.png +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/attachments/Claude-Obsidian-Demo.mp4 +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/attachments/Prompt.png +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/attachments/disk-ai-logo-400x400.png +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/attachments/disk-ai-logo.png +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/attachments/prompt 1.png +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/attachments/prompt2.png +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/attachments/prompt3.png +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/attachments/prompt4.png +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/docs/publish.js +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/examples/Coffee Notes/Brewing Equipment.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/examples/Coffee Notes/Coffee Bean Origins.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/examples/Coffee Notes/Coffee Brewing Methods.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/examples/Coffee Notes/Coffee Flavor Map.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/examples/Coffee Notes/Coffee Knowledge Base.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/examples/Coffee Notes/Flavor Extraction.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/examples/Coffee Notes/Perfect Pour Over Coffee Method.canvas +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/examples/Coffee Notes/Tasting Notes.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/examples/testing/Test Note Creation - Basic Functionality.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/llms-install.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/memory.json +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/pyproject.toml +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/scripts/install.sh +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/smithery.yaml +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/alembic/alembic.ini +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/alembic/env.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/alembic/migrations.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/alembic/script.py.mako +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/alembic/versions/3dae7c7b1564_initial_schema.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/alembic/versions/502b60eaa905_remove_required_from_entity_permalink.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/alembic/versions/5fe1ab1ccebe_add_projects_table.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/alembic/versions/647e7a75e2cd_project_constraint_fix.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/alembic/versions/b3c3938bacdb_relation_to_name_unique_index.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/alembic/versions/cc7172b46608_update_search_index_schema.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/api/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/api/app.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/api/routers/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/api/routers/directory_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/api/routers/importer_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/api/routers/knowledge_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/api/routers/management_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/api/routers/memory_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/api/routers/project_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/api/routers/prompt_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/api/routers/resource_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/api/routers/search_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/api/routers/utils.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/api/template_loader.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/cli/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/cli/app.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/cli/commands/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/cli/commands/auth.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/cli/commands/db.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/cli/commands/import_chatgpt.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/cli/commands/import_claude_conversations.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/cli/commands/import_claude_projects.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/cli/commands/import_memory_json.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/cli/commands/mcp.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/cli/commands/status.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/cli/commands/sync.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/cli/commands/tool.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/cli/main.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/config.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/db.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/deps.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/file_utils.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/importers/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/importers/base.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/importers/chatgpt_importer.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/importers/claude_conversations_importer.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/importers/claude_projects_importer.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/importers/memory_json_importer.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/importers/utils.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/markdown/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/markdown/entity_parser.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/markdown/markdown_processor.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/markdown/plugins.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/markdown/schemas.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/markdown/utils.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/async_client.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/auth_provider.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/external_auth_provider.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/project_session.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/prompts/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/prompts/ai_assistant_guide.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/prompts/continue_conversation.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/prompts/recent_activity.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/prompts/search.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/prompts/sync_status.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/prompts/utils.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/resources/ai_assistant_guide.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/resources/project_info.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/server.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/supabase_auth_provider.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/build_context.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/canvas.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/delete_note.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/edit_note.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/list_directory.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/move_note.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/read_content.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/read_note.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/recent_activity.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/search.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/sync_status.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/utils.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/view_note.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/write_note.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/models/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/models/base.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/models/knowledge.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/models/project.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/models/search.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/repository/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/repository/entity_repository.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/repository/observation_repository.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/repository/project_info_repository.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/repository/project_repository.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/repository/relation_repository.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/repository/repository.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/repository/search_repository.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/schemas/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/schemas/base.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/schemas/delete.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/schemas/directory.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/schemas/importer.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/schemas/memory.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/schemas/prompt.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/schemas/request.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/schemas/response.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/schemas/search.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/services/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/services/context_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/services/directory_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/services/entity_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/services/exceptions.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/services/file_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/services/initialization.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/services/link_resolver.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/services/migration_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/services/search_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/services/service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/services/sync_status_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/sync/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/sync/background_sync.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/sync/sync_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/sync/watch_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/templates/prompts/continue_conversation.hbs +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/templates/prompts/search.hbs +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/utils.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/static/ai_assistant_guide.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/static/json_canvas_spec_1_0.md +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/test-int/conftest.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/test-int/mcp/test_build_context_validation.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/test-int/mcp/test_delete_note_integration.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/test-int/mcp/test_edit_note_integration.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/test-int/mcp/test_list_directory_integration.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/test-int/mcp/test_move_note_integration.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/test-int/mcp/test_project_management_integration.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/test-int/mcp/test_read_content_integration.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/test-int/mcp/test_read_note_integration.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/test-int/mcp/test_search_integration.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/test-int/mcp/test_write_note_integration.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/Non-MarkdownFileSupport.pdf +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/Screenshot.png +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/api/conftest.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/api/test_continue_conversation_template.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/api/test_directory_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/api/test_importer_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/api/test_knowledge_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/api/test_management_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/api/test_memory_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/api/test_project_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/api/test_project_router_operations.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/api/test_prompt_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/api/test_resource_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/api/test_search_router.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/api/test_search_template.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/api/test_template_loader.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/api/test_template_loader_helpers.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/cli/conftest.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/cli/test_auth_commands.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/cli/test_cli_tools.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/cli/test_import_chatgpt.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/cli/test_import_claude_conversations.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/cli/test_import_claude_projects.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/cli/test_import_memory_json.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/cli/test_project_info.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/cli/test_status.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/cli/test_sync.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/cli/test_version.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/importers/test_importer_base.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/importers/test_importer_utils.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/markdown/__init__.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/markdown/test_entity_parser.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/markdown/test_markdown_plugins.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/markdown/test_markdown_processor.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/markdown/test_observation_edge_cases.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/markdown/test_parser_edge_cases.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/markdown/test_relation_edge_cases.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/markdown/test_task_detection.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/conftest.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_auth_provider.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_prompts.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_resource_project_info.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_resources.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_server.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_tool_build_context.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_tool_canvas.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_tool_delete_note.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_tool_edit_note.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_tool_list_directory.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_tool_move_note.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_tool_read_note.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_tool_recent_activity.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_tool_resource.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_tool_search.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_tool_sync_status.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_tool_utils.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_tool_view_note.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/mcp/test_tool_write_note.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/repository/test_entity_repository.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/repository/test_observation_repository.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/repository/test_project_info_repository.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/repository/test_project_repository.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/repository/test_relation_repository.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/repository/test_repository.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/repository/test_search_repository.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/schemas/test_memory_url.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/schemas/test_memory_url_validation.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/schemas/test_schemas.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/schemas/test_search.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/services/test_context_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/services/test_directory_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/services/test_entity_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/services/test_file_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/services/test_initialization.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/services/test_link_resolver.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/services/test_project_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/services/test_project_service_operations.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/services/test_search_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/services/test_sync_status_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/sync/test_sync_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/sync/test_sync_wikilink_issue.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/sync/test_tmp_files.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/sync/test_watch_service.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/sync/test_watch_service_edge_cases.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/utils/test_file_utils.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/utils/test_parse_tags.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/utils/test_permalink_formatting.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/tests/utils/test_utf8_handling.py +0 -0
- {basic_memory-0.13.1 → basic_memory-0.13.2}/uv.lock +0 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
# /beta - Create Beta Release
|
|
2
|
+
|
|
3
|
+
Create a new beta release using the automated justfile target with quality checks and tagging.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```
|
|
7
|
+
/beta <version>
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
**Parameters:**
|
|
11
|
+
- `version` (required): Beta version like `v0.13.2b1` or `v0.13.2rc1`
|
|
12
|
+
|
|
13
|
+
## Implementation
|
|
14
|
+
|
|
15
|
+
You are an expert release manager for the Basic Memory project. When the user runs `/beta`, execute the following steps:
|
|
16
|
+
|
|
17
|
+
### Step 1: Pre-flight Validation
|
|
18
|
+
1. Verify version format matches `v\d+\.\d+\.\d+(b\d+|rc\d+)` pattern
|
|
19
|
+
2. Check current git status for uncommitted changes
|
|
20
|
+
3. Verify we're on the `main` branch
|
|
21
|
+
4. Confirm no existing tag with this version
|
|
22
|
+
|
|
23
|
+
### Step 2: Use Justfile Automation
|
|
24
|
+
Execute the automated beta release process:
|
|
25
|
+
```bash
|
|
26
|
+
just beta <version>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
The justfile target handles:
|
|
30
|
+
- ✅ Beta version format validation (supports b1, b2, rc1, etc.)
|
|
31
|
+
- ✅ Git status and branch checks
|
|
32
|
+
- ✅ Quality checks (`just check` - lint, format, type-check, tests)
|
|
33
|
+
- ✅ Version update in `src/basic_memory/__init__.py`
|
|
34
|
+
- ✅ Automatic commit with proper message
|
|
35
|
+
- ✅ Tag creation and pushing to GitHub
|
|
36
|
+
- ✅ Beta release workflow trigger
|
|
37
|
+
|
|
38
|
+
### Step 3: Monitor Beta Release
|
|
39
|
+
1. Check GitHub Actions workflow starts successfully
|
|
40
|
+
2. Monitor workflow at: https://github.com/basicmachines-co/basic-memory/actions
|
|
41
|
+
3. Verify PyPI pre-release publication
|
|
42
|
+
4. Test beta installation: `uv tool install basic-memory --pre`
|
|
43
|
+
|
|
44
|
+
### Step 4: Beta Testing Instructions
|
|
45
|
+
Provide users with beta testing instructions:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
# Install/upgrade to beta
|
|
49
|
+
uv tool install basic-memory --pre
|
|
50
|
+
|
|
51
|
+
# Or upgrade existing installation
|
|
52
|
+
uv tool upgrade basic-memory --prerelease=allow
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Version Guidelines
|
|
56
|
+
- **First beta**: `v0.13.2b1`
|
|
57
|
+
- **Subsequent betas**: `v0.13.2b2`, `v0.13.2b3`, etc.
|
|
58
|
+
- **Release candidates**: `v0.13.2rc1`, `v0.13.2rc2`, etc.
|
|
59
|
+
- **Final release**: `v0.13.2` (use `/release` command)
|
|
60
|
+
|
|
61
|
+
## Error Handling
|
|
62
|
+
- If `just beta` fails, examine the error output for specific issues
|
|
63
|
+
- If quality checks fail, fix issues and retry
|
|
64
|
+
- If version format is invalid, correct and retry
|
|
65
|
+
- If tag already exists, increment version number
|
|
66
|
+
|
|
67
|
+
## Success Output
|
|
68
|
+
```
|
|
69
|
+
✅ Beta Release v0.13.2b1 Created Successfully!
|
|
70
|
+
|
|
71
|
+
🏷️ Tag: v0.13.2b1
|
|
72
|
+
🚀 GitHub Actions: Running
|
|
73
|
+
📦 PyPI: Will be available in ~5 minutes as pre-release
|
|
74
|
+
|
|
75
|
+
Install/test with:
|
|
76
|
+
uv tool install basic-memory --pre
|
|
77
|
+
|
|
78
|
+
Monitor release: https://github.com/basicmachines-co/basic-memory/actions
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Beta Testing Workflow
|
|
82
|
+
1. **Create beta**: Use `/beta v0.13.2b1`
|
|
83
|
+
2. **Test features**: Install and validate new functionality
|
|
84
|
+
3. **Fix issues**: Address bugs found during testing
|
|
85
|
+
4. **Iterate**: Create `v0.13.2b2` if needed
|
|
86
|
+
5. **Release candidate**: Create `v0.13.2rc1` when stable
|
|
87
|
+
6. **Final release**: Use `/release v0.13.2` when ready
|
|
88
|
+
|
|
89
|
+
## Context
|
|
90
|
+
- Beta releases are pre-releases for testing new features
|
|
91
|
+
- Automatically published to PyPI with pre-release flag
|
|
92
|
+
- Uses the automated justfile target for consistency
|
|
93
|
+
- Version is automatically updated in `__init__.py`
|
|
94
|
+
- Ideal for validating changes before stable release
|
|
95
|
+
- Supports both beta (b1, b2) and release candidate (rc1, rc2) versions
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# /release - Create Stable Release
|
|
2
|
+
|
|
3
|
+
Create a stable release using the automated justfile target with comprehensive validation.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
```
|
|
7
|
+
/release <version>
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
**Parameters:**
|
|
11
|
+
- `version` (required): Release version like `v0.13.2`
|
|
12
|
+
|
|
13
|
+
## Implementation
|
|
14
|
+
|
|
15
|
+
You are an expert release manager for the Basic Memory project. When the user runs `/release`, execute the following steps:
|
|
16
|
+
|
|
17
|
+
### Step 1: Pre-flight Validation
|
|
18
|
+
1. Verify version format matches `v\d+\.\d+\.\d+` pattern
|
|
19
|
+
2. Check current git status for uncommitted changes
|
|
20
|
+
3. Verify we're on the `main` branch
|
|
21
|
+
4. Confirm no existing tag with this version
|
|
22
|
+
|
|
23
|
+
### Step 2: Use Justfile Automation
|
|
24
|
+
Execute the automated release process:
|
|
25
|
+
```bash
|
|
26
|
+
just release <version>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
The justfile target handles:
|
|
30
|
+
- ✅ Version format validation
|
|
31
|
+
- ✅ Git status and branch checks
|
|
32
|
+
- ✅ Quality checks (`just check` - lint, format, type-check, tests)
|
|
33
|
+
- ✅ Version update in `src/basic_memory/__init__.py`
|
|
34
|
+
- ✅ Automatic commit with proper message
|
|
35
|
+
- ✅ Tag creation and pushing to GitHub
|
|
36
|
+
- ✅ Release workflow trigger
|
|
37
|
+
|
|
38
|
+
### Step 3: Monitor Release Process
|
|
39
|
+
1. Check that GitHub Actions workflow starts successfully
|
|
40
|
+
2. Monitor workflow completion at: https://github.com/basicmachines-co/basic-memory/actions
|
|
41
|
+
3. Verify PyPI publication
|
|
42
|
+
4. Test installation: `uv tool install basic-memory`
|
|
43
|
+
|
|
44
|
+
### Step 4: Post-Release Validation
|
|
45
|
+
1. Verify GitHub release is created automatically
|
|
46
|
+
2. Check PyPI publication
|
|
47
|
+
3. Validate release assets
|
|
48
|
+
4. Update any post-release documentation
|
|
49
|
+
|
|
50
|
+
## Pre-conditions Check
|
|
51
|
+
Before starting, verify:
|
|
52
|
+
- [ ] All beta testing is complete
|
|
53
|
+
- [ ] Critical bugs are fixed
|
|
54
|
+
- [ ] Breaking changes are documented
|
|
55
|
+
- [ ] CHANGELOG.md is updated (if needed)
|
|
56
|
+
- [ ] Version number follows semantic versioning
|
|
57
|
+
|
|
58
|
+
## Error Handling
|
|
59
|
+
- If `just release` fails, examine the error output for specific issues
|
|
60
|
+
- If quality checks fail, fix issues and retry
|
|
61
|
+
- If changelog entry missing, update CHANGELOG.md and commit before retrying
|
|
62
|
+
- If GitHub Actions fail, check workflow logs for debugging
|
|
63
|
+
|
|
64
|
+
## Success Output
|
|
65
|
+
```
|
|
66
|
+
🎉 Stable Release v0.13.2 Created Successfully!
|
|
67
|
+
|
|
68
|
+
🏷️ Tag: v0.13.2
|
|
69
|
+
📋 GitHub Release: https://github.com/basicmachines-co/basic-memory/releases/tag/v0.13.2
|
|
70
|
+
📦 PyPI: https://pypi.org/project/basic-memory/0.13.2/
|
|
71
|
+
🚀 GitHub Actions: Completed
|
|
72
|
+
|
|
73
|
+
Install with:
|
|
74
|
+
uv tool install basic-memory
|
|
75
|
+
|
|
76
|
+
Users can now upgrade:
|
|
77
|
+
uv tool upgrade basic-memory
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Context
|
|
81
|
+
- This creates production releases used by end users
|
|
82
|
+
- Must pass all quality gates before proceeding
|
|
83
|
+
- Uses the automated justfile target for consistency
|
|
84
|
+
- Version is automatically updated in `__init__.py`
|
|
85
|
+
- Triggers automated GitHub release with changelog
|
|
86
|
+
- Leverages uv-dynamic-versioning for package version management
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: basic-memory
|
|
3
|
-
Version: 0.13.
|
|
3
|
+
Version: 0.13.2
|
|
4
4
|
Summary: Local-first knowledge management combining Zettelkasten with knowledge graphs
|
|
5
5
|
Project-URL: Homepage, https://github.com/basicmachines-co/basic-memory
|
|
6
6
|
Project-URL: Repository, https://github.com/basicmachines-co/basic-memory
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# Basic Memory - Modern Command Runner
|
|
2
|
+
|
|
3
|
+
# Install dependencies
|
|
4
|
+
install:
|
|
5
|
+
pip install -e ".[dev]"
|
|
6
|
+
|
|
7
|
+
# Run unit tests in parallel
|
|
8
|
+
test-unit:
|
|
9
|
+
uv run pytest -p pytest_mock -v -n auto
|
|
10
|
+
|
|
11
|
+
# Run integration tests in parallel
|
|
12
|
+
test-int:
|
|
13
|
+
uv run pytest -p pytest_mock -v --no-cov -n auto test-int
|
|
14
|
+
|
|
15
|
+
# Run all tests
|
|
16
|
+
test: test-unit test-int
|
|
17
|
+
|
|
18
|
+
# Lint and fix code
|
|
19
|
+
lint:
|
|
20
|
+
ruff check . --fix
|
|
21
|
+
|
|
22
|
+
# Type check code
|
|
23
|
+
type-check:
|
|
24
|
+
uv run pyright
|
|
25
|
+
|
|
26
|
+
# Clean build artifacts and cache files
|
|
27
|
+
clean:
|
|
28
|
+
find . -type f -name '*.pyc' -delete
|
|
29
|
+
find . -type d -name '__pycache__' -exec rm -r {} +
|
|
30
|
+
rm -rf installer/build/ installer/dist/ dist/
|
|
31
|
+
rm -f rw.*.dmg .coverage.*
|
|
32
|
+
|
|
33
|
+
# Format code with ruff
|
|
34
|
+
format:
|
|
35
|
+
uv run ruff format .
|
|
36
|
+
|
|
37
|
+
# Run MCP inspector tool
|
|
38
|
+
run-inspector:
|
|
39
|
+
npx @modelcontextprotocol/inspector
|
|
40
|
+
|
|
41
|
+
# Build macOS installer
|
|
42
|
+
installer-mac:
|
|
43
|
+
cd installer && chmod +x make_icons.sh && ./make_icons.sh
|
|
44
|
+
cd installer && uv run python setup.py bdist_mac
|
|
45
|
+
|
|
46
|
+
# Build Windows installer
|
|
47
|
+
installer-win:
|
|
48
|
+
cd installer && uv run python setup.py bdist_win32
|
|
49
|
+
|
|
50
|
+
# Update all dependencies to latest versions
|
|
51
|
+
update-deps:
|
|
52
|
+
uv sync --upgrade
|
|
53
|
+
|
|
54
|
+
# Run all code quality checks and tests
|
|
55
|
+
check: lint format type-check test
|
|
56
|
+
|
|
57
|
+
# Generate Alembic migration with descriptive message
|
|
58
|
+
migration message:
|
|
59
|
+
cd src/basic_memory/alembic && alembic revision --autogenerate -m "{{message}}"
|
|
60
|
+
|
|
61
|
+
# Create a stable release (e.g., just release v0.13.2)
|
|
62
|
+
release version:
|
|
63
|
+
#!/usr/bin/env bash
|
|
64
|
+
set -euo pipefail
|
|
65
|
+
|
|
66
|
+
# Validate version format
|
|
67
|
+
if [[ ! "{{version}}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
|
|
68
|
+
echo "❌ Invalid version format. Use: v0.13.2"
|
|
69
|
+
exit 1
|
|
70
|
+
fi
|
|
71
|
+
|
|
72
|
+
# Extract version number without 'v' prefix
|
|
73
|
+
VERSION_NUM=$(echo "{{version}}" | sed 's/^v//')
|
|
74
|
+
|
|
75
|
+
echo "🚀 Creating stable release {{version}}"
|
|
76
|
+
|
|
77
|
+
# Pre-flight checks
|
|
78
|
+
echo "📋 Running pre-flight checks..."
|
|
79
|
+
if [[ -n $(git status --porcelain) ]]; then
|
|
80
|
+
echo "❌ Uncommitted changes found. Please commit or stash them first."
|
|
81
|
+
exit 1
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
if [[ $(git branch --show-current) != "main" ]]; then
|
|
85
|
+
echo "❌ Not on main branch. Switch to main first."
|
|
86
|
+
exit 1
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
# Check if tag already exists
|
|
90
|
+
if git tag -l "{{version}}" | grep -q "{{version}}"; then
|
|
91
|
+
echo "❌ Tag {{version}} already exists"
|
|
92
|
+
exit 1
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
# Run quality checks
|
|
96
|
+
echo "🔍 Running quality checks..."
|
|
97
|
+
just check
|
|
98
|
+
|
|
99
|
+
# Update version in __init__.py
|
|
100
|
+
echo "📝 Updating version in __init__.py..."
|
|
101
|
+
sed -i.bak "s/__version__ = \".*\"/__version__ = \"$VERSION_NUM\"/" src/basic_memory/__init__.py
|
|
102
|
+
rm -f src/basic_memory/__init__.py.bak
|
|
103
|
+
|
|
104
|
+
# Commit version update
|
|
105
|
+
git add src/basic_memory/__init__.py
|
|
106
|
+
git commit -m "chore: update version to $VERSION_NUM for {{version}} release"
|
|
107
|
+
|
|
108
|
+
# Create and push tag
|
|
109
|
+
echo "🏷️ Creating tag {{version}}..."
|
|
110
|
+
git tag "{{version}}"
|
|
111
|
+
|
|
112
|
+
echo "📤 Pushing to GitHub..."
|
|
113
|
+
git push origin main
|
|
114
|
+
git push origin "{{version}}"
|
|
115
|
+
|
|
116
|
+
echo "✅ Release {{version}} created successfully!"
|
|
117
|
+
echo "📦 GitHub Actions will build and publish to PyPI"
|
|
118
|
+
echo "🔗 Monitor at: https://github.com/basicmachines-co/basic-memory/actions"
|
|
119
|
+
|
|
120
|
+
# Create a beta release (e.g., just beta v0.13.2b1)
|
|
121
|
+
beta version:
|
|
122
|
+
#!/usr/bin/env bash
|
|
123
|
+
set -euo pipefail
|
|
124
|
+
|
|
125
|
+
# Validate version format (allow beta/rc suffixes)
|
|
126
|
+
if [[ ! "{{version}}" =~ ^v[0-9]+\.[0-9]+\.[0-9]+(b[0-9]+|rc[0-9]+)$ ]]; then
|
|
127
|
+
echo "❌ Invalid beta version format. Use: v0.13.2b1 or v0.13.2rc1"
|
|
128
|
+
exit 1
|
|
129
|
+
fi
|
|
130
|
+
|
|
131
|
+
# Extract version number without 'v' prefix
|
|
132
|
+
VERSION_NUM=$(echo "{{version}}" | sed 's/^v//')
|
|
133
|
+
|
|
134
|
+
echo "🧪 Creating beta release {{version}}"
|
|
135
|
+
|
|
136
|
+
# Pre-flight checks
|
|
137
|
+
echo "📋 Running pre-flight checks..."
|
|
138
|
+
if [[ -n $(git status --porcelain) ]]; then
|
|
139
|
+
echo "❌ Uncommitted changes found. Please commit or stash them first."
|
|
140
|
+
exit 1
|
|
141
|
+
fi
|
|
142
|
+
|
|
143
|
+
if [[ $(git branch --show-current) != "main" ]]; then
|
|
144
|
+
echo "❌ Not on main branch. Switch to main first."
|
|
145
|
+
exit 1
|
|
146
|
+
fi
|
|
147
|
+
|
|
148
|
+
# Check if tag already exists
|
|
149
|
+
if git tag -l "{{version}}" | grep -q "{{version}}"; then
|
|
150
|
+
echo "❌ Tag {{version}} already exists"
|
|
151
|
+
exit 1
|
|
152
|
+
fi
|
|
153
|
+
|
|
154
|
+
# Run quality checks
|
|
155
|
+
echo "🔍 Running quality checks..."
|
|
156
|
+
just check
|
|
157
|
+
|
|
158
|
+
# Update version in __init__.py
|
|
159
|
+
echo "📝 Updating version in __init__.py..."
|
|
160
|
+
sed -i.bak "s/__version__ = \".*\"/__version__ = \"$VERSION_NUM\"/" src/basic_memory/__init__.py
|
|
161
|
+
rm -f src/basic_memory/__init__.py.bak
|
|
162
|
+
|
|
163
|
+
# Commit version update
|
|
164
|
+
git add src/basic_memory/__init__.py
|
|
165
|
+
git commit -m "chore: update version to $VERSION_NUM for {{version}} beta release"
|
|
166
|
+
|
|
167
|
+
# Create and push tag
|
|
168
|
+
echo "🏷️ Creating tag {{version}}..."
|
|
169
|
+
git tag "{{version}}"
|
|
170
|
+
|
|
171
|
+
echo "📤 Pushing to GitHub..."
|
|
172
|
+
git push origin main
|
|
173
|
+
git push origin "{{version}}"
|
|
174
|
+
|
|
175
|
+
echo "✅ Beta release {{version}} created successfully!"
|
|
176
|
+
echo "📦 GitHub Actions will build and publish to PyPI as pre-release"
|
|
177
|
+
echo "🔗 Monitor at: https://github.com/basicmachines-co/basic-memory/actions"
|
|
178
|
+
echo "📥 Install with: uv tool install basic-memory --pre"
|
|
179
|
+
|
|
180
|
+
# List all available recipes
|
|
181
|
+
default:
|
|
182
|
+
@just --list
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
"""basic-memory - Local-first knowledge management combining Zettelkasten with knowledge graphs"""
|
|
2
2
|
|
|
3
|
+
# Package version - updated by release automation
|
|
4
|
+
__version__ = "0.13.2"
|
|
5
|
+
|
|
3
6
|
# API version for FastAPI - independent of package version
|
|
4
|
-
|
|
7
|
+
__api_version__ = "v0"
|
|
@@ -9,7 +9,6 @@ from rich.console import Console
|
|
|
9
9
|
from rich.table import Table
|
|
10
10
|
|
|
11
11
|
from basic_memory.cli.app import app
|
|
12
|
-
from basic_memory.config import config
|
|
13
12
|
from basic_memory.mcp.project_session import session
|
|
14
13
|
from basic_memory.mcp.resources.project_info import project_info
|
|
15
14
|
import json
|
|
@@ -24,6 +23,7 @@ from basic_memory.mcp.tools.utils import call_post
|
|
|
24
23
|
from basic_memory.schemas.project_info import ProjectStatusResponse
|
|
25
24
|
from basic_memory.mcp.tools.utils import call_delete
|
|
26
25
|
from basic_memory.mcp.tools.utils import call_put
|
|
26
|
+
from basic_memory.utils import generate_permalink
|
|
27
27
|
|
|
28
28
|
console = Console()
|
|
29
29
|
|
|
@@ -44,11 +44,8 @@ def format_path(path: str) -> str:
|
|
|
44
44
|
def list_projects() -> None:
|
|
45
45
|
"""List all configured projects."""
|
|
46
46
|
# Use API to list projects
|
|
47
|
-
|
|
48
|
-
project_url = config.project_url
|
|
49
|
-
|
|
50
47
|
try:
|
|
51
|
-
response = asyncio.run(call_get(client,
|
|
48
|
+
response = asyncio.run(call_get(client, "/projects/projects"))
|
|
52
49
|
result = ProjectList.model_validate(response.json())
|
|
53
50
|
|
|
54
51
|
table = Table(title="Basic Memory Projects")
|
|
@@ -65,7 +62,6 @@ def list_projects() -> None:
|
|
|
65
62
|
console.print(table)
|
|
66
63
|
except Exception as e:
|
|
67
64
|
console.print(f"[red]Error listing projects: {str(e)}[/red]")
|
|
68
|
-
console.print("[yellow]Note: Make sure the Basic Memory server is running.[/yellow]")
|
|
69
65
|
raise typer.Exit(1)
|
|
70
66
|
|
|
71
67
|
|
|
@@ -80,16 +76,14 @@ def add_project(
|
|
|
80
76
|
resolved_path = os.path.abspath(os.path.expanduser(path))
|
|
81
77
|
|
|
82
78
|
try:
|
|
83
|
-
project_url = config.project_url
|
|
84
79
|
data = {"name": name, "path": resolved_path, "set_default": set_default}
|
|
85
80
|
|
|
86
|
-
response = asyncio.run(call_post(client,
|
|
81
|
+
response = asyncio.run(call_post(client, "/projects/projects", json=data))
|
|
87
82
|
result = ProjectStatusResponse.model_validate(response.json())
|
|
88
83
|
|
|
89
84
|
console.print(f"[green]{result.message}[/green]")
|
|
90
85
|
except Exception as e:
|
|
91
86
|
console.print(f"[red]Error adding project: {str(e)}[/red]")
|
|
92
|
-
console.print("[yellow]Note: Make sure the Basic Memory server is running.[/yellow]")
|
|
93
87
|
raise typer.Exit(1)
|
|
94
88
|
|
|
95
89
|
# Display usage hint
|
|
@@ -105,15 +99,13 @@ def remove_project(
|
|
|
105
99
|
) -> None:
|
|
106
100
|
"""Remove a project from configuration."""
|
|
107
101
|
try:
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
response = asyncio.run(call_delete(client, f"{project_url}/project/projects/{name}"))
|
|
102
|
+
project_name = generate_permalink(name)
|
|
103
|
+
response = asyncio.run(call_delete(client, f"/projects/{project_name}"))
|
|
111
104
|
result = ProjectStatusResponse.model_validate(response.json())
|
|
112
105
|
|
|
113
106
|
console.print(f"[green]{result.message}[/green]")
|
|
114
107
|
except Exception as e:
|
|
115
108
|
console.print(f"[red]Error removing project: {str(e)}[/red]")
|
|
116
|
-
console.print("[yellow]Note: Make sure the Basic Memory server is running.[/yellow]")
|
|
117
109
|
raise typer.Exit(1)
|
|
118
110
|
|
|
119
111
|
# Show this message regardless of method used
|
|
@@ -126,20 +118,16 @@ def set_default_project(
|
|
|
126
118
|
) -> None:
|
|
127
119
|
"""Set the default project and activate it for the current session."""
|
|
128
120
|
try:
|
|
129
|
-
|
|
121
|
+
project_name = generate_permalink(name)
|
|
130
122
|
|
|
131
|
-
response = asyncio.run(call_put(client, f"
|
|
123
|
+
response = asyncio.run(call_put(client, f"projects/{project_name}/default"))
|
|
132
124
|
result = ProjectStatusResponse.model_validate(response.json())
|
|
133
125
|
|
|
134
126
|
console.print(f"[green]{result.message}[/green]")
|
|
135
127
|
except Exception as e:
|
|
136
128
|
console.print(f"[red]Error setting default project: {str(e)}[/red]")
|
|
137
|
-
console.print("[yellow]Note: Make sure the Basic Memory server is running.[/yellow]")
|
|
138
129
|
raise typer.Exit(1)
|
|
139
130
|
|
|
140
|
-
# Always activate it for the current session
|
|
141
|
-
os.environ["BASIC_MEMORY_PROJECT"] = name
|
|
142
|
-
|
|
143
131
|
# Reload configuration to apply the change
|
|
144
132
|
from importlib import reload
|
|
145
133
|
from basic_memory import config as config_module
|
|
@@ -149,21 +137,18 @@ def set_default_project(
|
|
|
149
137
|
console.print("[green]Project activated for current session[/green]")
|
|
150
138
|
|
|
151
139
|
|
|
152
|
-
@project_app.command("sync")
|
|
140
|
+
@project_app.command("sync-config")
|
|
153
141
|
def synchronize_projects() -> None:
|
|
154
|
-
"""Synchronize
|
|
142
|
+
"""Synchronize project config between configuration file and database."""
|
|
155
143
|
# Call the API to synchronize projects
|
|
156
144
|
|
|
157
|
-
project_url = config.project_url
|
|
158
|
-
|
|
159
145
|
try:
|
|
160
|
-
response = asyncio.run(call_post(client,
|
|
146
|
+
response = asyncio.run(call_post(client, "/projects/sync"))
|
|
161
147
|
result = ProjectStatusResponse.model_validate(response.json())
|
|
162
148
|
|
|
163
149
|
console.print(f"[green]{result.message}[/green]")
|
|
164
150
|
except Exception as e: # pragma: no cover
|
|
165
151
|
console.print(f"[red]Error synchronizing projects: {str(e)}[/red]")
|
|
166
|
-
console.print("[yellow]Note: Make sure the Basic Memory server is running.[/yellow]")
|
|
167
152
|
raise typer.Exit(1)
|
|
168
153
|
|
|
169
154
|
|
{basic_memory-0.13.1 → basic_memory-0.13.2}/src/basic_memory/mcp/tools/project_management.py
RENAMED
|
@@ -16,6 +16,7 @@ from basic_memory.mcp.server import mcp
|
|
|
16
16
|
from basic_memory.mcp.tools.utils import call_get, call_put, call_post, call_delete
|
|
17
17
|
from basic_memory.schemas import ProjectInfoResponse
|
|
18
18
|
from basic_memory.schemas.project_info import ProjectList, ProjectStatusResponse, ProjectInfoRequest
|
|
19
|
+
from basic_memory.utils import generate_permalink
|
|
19
20
|
|
|
20
21
|
|
|
21
22
|
@mcp.tool()
|
|
@@ -77,6 +78,7 @@ async def switch_project(project_name: str, ctx: Context | None = None) -> str:
|
|
|
77
78
|
if ctx: # pragma: no cover
|
|
78
79
|
await ctx.info(f"Switching to project: {project_name}")
|
|
79
80
|
|
|
81
|
+
project_permalink = generate_permalink(project_name)
|
|
80
82
|
current_project = session.get_current_project()
|
|
81
83
|
try:
|
|
82
84
|
# Validate project exists by getting project list
|
|
@@ -84,13 +86,13 @@ async def switch_project(project_name: str, ctx: Context | None = None) -> str:
|
|
|
84
86
|
project_list = ProjectList.model_validate(response.json())
|
|
85
87
|
|
|
86
88
|
# Check if project exists
|
|
87
|
-
project_exists = any(p.
|
|
89
|
+
project_exists = any(p.permalink == project_permalink for p in project_list.projects)
|
|
88
90
|
if not project_exists:
|
|
89
91
|
available_projects = [p.name for p in project_list.projects]
|
|
90
92
|
return f"Error: Project '{project_name}' not found. Available projects: {', '.join(available_projects)}"
|
|
91
93
|
|
|
92
94
|
# Switch to the project
|
|
93
|
-
session.set_current_project(
|
|
95
|
+
session.set_current_project(project_permalink)
|
|
94
96
|
current_project = session.get_current_project()
|
|
95
97
|
project_config = get_project_config(current_project)
|
|
96
98
|
|
|
@@ -99,11 +101,11 @@ async def switch_project(project_name: str, ctx: Context | None = None) -> str:
|
|
|
99
101
|
response = await call_get(
|
|
100
102
|
client,
|
|
101
103
|
f"{project_config.project_url}/project/info",
|
|
102
|
-
params={"project_name":
|
|
104
|
+
params={"project_name": project_permalink},
|
|
103
105
|
)
|
|
104
106
|
project_info = ProjectInfoResponse.model_validate(response.json())
|
|
105
107
|
|
|
106
|
-
result = f"✓ Switched to {
|
|
108
|
+
result = f"✓ Switched to {project_permalink} project\n\n"
|
|
107
109
|
result += "Project Summary:\n"
|
|
108
110
|
result += f"• {project_info.statistics.total_entities} entities\n"
|
|
109
111
|
result += f"• {project_info.statistics.total_observations} observations\n"
|
|
@@ -329,4 +331,4 @@ async def delete_project(project_name: str, ctx: Context | None = None) -> str:
|
|
|
329
331
|
result += "Files remain on disk but project is no longer tracked by Basic Memory.\n"
|
|
330
332
|
result += "Re-add the project to access its content again.\n"
|
|
331
333
|
|
|
332
|
-
return add_project_metadata(result, session.get_current_project())
|
|
334
|
+
return add_project_metadata(result, session.get_current_project())
|
|
@@ -6,6 +6,8 @@ from typing import Dict, List, Optional, Any
|
|
|
6
6
|
|
|
7
7
|
from pydantic import Field, BaseModel
|
|
8
8
|
|
|
9
|
+
from basic_memory.utils import generate_permalink
|
|
10
|
+
|
|
9
11
|
|
|
10
12
|
class ProjectStatistics(BaseModel):
|
|
11
13
|
"""Statistics about the current project."""
|
|
@@ -183,6 +185,10 @@ class ProjectItem(BaseModel):
|
|
|
183
185
|
name: str
|
|
184
186
|
path: str
|
|
185
187
|
is_default: bool = False
|
|
188
|
+
|
|
189
|
+
@property
|
|
190
|
+
def permalink(self) -> str: # pragma: no cover
|
|
191
|
+
return generate_permalink(self.name)
|
|
186
192
|
|
|
187
193
|
|
|
188
194
|
class ProjectList(BaseModel):
|
|
@@ -207,7 +207,7 @@ class ProjectService:
|
|
|
207
207
|
|
|
208
208
|
# Get all projects from database
|
|
209
209
|
db_projects = await self.repository.get_active_projects()
|
|
210
|
-
|
|
210
|
+
db_projects_by_permalink = {p.permalink: p for p in db_projects}
|
|
211
211
|
|
|
212
212
|
# Get all projects from configuration and normalize names if needed
|
|
213
213
|
config_projects = config_manager.projects.copy()
|
|
@@ -235,7 +235,7 @@ class ProjectService:
|
|
|
235
235
|
|
|
236
236
|
# Add projects that exist in config but not in DB
|
|
237
237
|
for name, path in config_projects.items():
|
|
238
|
-
if name not in
|
|
238
|
+
if name not in db_projects_by_permalink:
|
|
239
239
|
logger.info(f"Adding project '{name}' to database")
|
|
240
240
|
project_data = {
|
|
241
241
|
"name": name,
|
|
@@ -247,7 +247,7 @@ class ProjectService:
|
|
|
247
247
|
await self.repository.create(project_data)
|
|
248
248
|
|
|
249
249
|
# Add projects that exist in DB but not in config to config
|
|
250
|
-
for name, project in
|
|
250
|
+
for name, project in db_projects_by_permalink.items():
|
|
251
251
|
if name not in config_projects:
|
|
252
252
|
logger.info(f"Adding project '{name}' to configuration")
|
|
253
253
|
config_manager.add_project(name, project.path)
|
|
@@ -668,4 +668,4 @@ class ProjectService:
|
|
|
668
668
|
database_size=db_size_readable,
|
|
669
669
|
watch_status=watch_status,
|
|
670
670
|
timestamp=datetime.now(),
|
|
671
|
-
)
|
|
671
|
+
)
|
|
@@ -93,8 +93,6 @@ def test_project_default_command(mock_reload, mock_run, cli_env):
|
|
|
93
93
|
|
|
94
94
|
# Just verify it runs without exception and environment is set
|
|
95
95
|
assert result.exit_code == 0
|
|
96
|
-
assert "BASIC_MEMORY_PROJECT" in os.environ
|
|
97
|
-
assert os.environ["BASIC_MEMORY_PROJECT"] == "test-project"
|
|
98
96
|
|
|
99
97
|
|
|
100
98
|
@patch("basic_memory.cli.commands.project.asyncio.run")
|
|
@@ -111,7 +109,7 @@ def test_project_sync_command(mock_run, cli_env):
|
|
|
111
109
|
mock_run.return_value = mock_response
|
|
112
110
|
|
|
113
111
|
runner = CliRunner()
|
|
114
|
-
result = runner.invoke(cli_app, ["project", "sync"])
|
|
112
|
+
result = runner.invoke(cli_app, ["project", "sync-config"])
|
|
115
113
|
|
|
116
114
|
# Just verify it runs without exception
|
|
117
115
|
assert result.exit_code == 0
|
|
@@ -134,7 +132,6 @@ def test_project_failure_exits_with_error(mock_run, cli_env):
|
|
|
134
132
|
# All should exit with code 1 and show error message
|
|
135
133
|
assert list_result.exit_code == 1
|
|
136
134
|
assert "Error listing projects" in list_result.output
|
|
137
|
-
assert "Make sure the Basic Memory server is running" in list_result.output
|
|
138
135
|
|
|
139
136
|
assert add_result.exit_code == 1
|
|
140
137
|
assert "Error adding project" in add_result.output
|
|
@@ -105,7 +105,6 @@ def config_manager(
|
|
|
105
105
|
)
|
|
106
106
|
|
|
107
107
|
# Patch the project config that CLI commands import (only modules that actually import config)
|
|
108
|
-
monkeypatch.setattr("basic_memory.cli.commands.project.config", project_config)
|
|
109
108
|
monkeypatch.setattr("basic_memory.cli.commands.sync.config", project_config)
|
|
110
109
|
monkeypatch.setattr("basic_memory.cli.commands.status.config", project_config)
|
|
111
110
|
monkeypatch.setattr("basic_memory.cli.commands.import_memory_json.config", project_config)
|