flurryx-code-memory 0.5.0__tar.gz → 0.5.1__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.
Files changed (169) hide show
  1. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/PKG-INFO +1 -1
  2. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/pyproject.toml +1 -1
  3. flurryx_code_memory-0.5.1/src/code_memory/__init__.py +16 -0
  4. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/updater.py +84 -27
  5. flurryx_code_memory-0.5.0/src/code_memory/__init__.py +0 -8
  6. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/.claude-plugin/marketplace.json +0 -0
  7. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/.env.example +0 -0
  8. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/.gitignore +0 -0
  9. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/CHANGELOG.md +0 -0
  10. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/README.md +0 -0
  11. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/docker/docker-compose.yml +0 -0
  12. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/docs/BENCHMARK.md +0 -0
  13. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/docs/BENCHMARK_VS_BASELINE.json +0 -0
  14. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/docs/BENCHMARK_VS_BASELINE.md +0 -0
  15. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/docs/architecture.png +0 -0
  16. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/docs/benchmark-raw.json +0 -0
  17. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/docs/hero.png +0 -0
  18. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/install.ps1 +0 -0
  19. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/install.sh +0 -0
  20. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  21. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/README.md +0 -0
  22. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/commands/code-memory.md +0 -0
  23. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/hooks/hooks.json +0 -0
  24. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/install.sh +0 -0
  25. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/scripts/lib/claim-intent.js +0 -0
  26. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/scripts/lib/claim-intent.test.js +0 -0
  27. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/scripts/lib/format.js +0 -0
  28. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/scripts/lib/intent.js +0 -0
  29. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/scripts/lib/io.js +0 -0
  30. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/scripts/lib/memory.js +0 -0
  31. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/scripts/lib/state.js +0 -0
  32. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/scripts/on-post-tool.js +0 -0
  33. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/scripts/on-pre-tool.js +0 -0
  34. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/scripts/on-retrieve-seen.js +0 -0
  35. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/scripts/on-session-start.js +0 -0
  36. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/scripts/on-stop.js +0 -0
  37. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/scripts/on-user-prompt.js +0 -0
  38. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/scripts/resolver-debounce.js +0 -0
  39. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/claude-code/skills/code-memory/SKILL.md +0 -0
  40. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/opencode/README.md +0 -0
  41. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/opencode/install.sh +0 -0
  42. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/opencode/package-lock.json +0 -0
  43. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/opencode/package.json +0 -0
  44. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/opencode/scripts/add-mcp.py +0 -0
  45. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/opencode/scripts/install.mjs +0 -0
  46. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/opencode/scripts/uninstall.mjs +0 -0
  47. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/opencode/skills/code-memory/SKILL.md +0 -0
  48. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/opencode/src/code-memory-lib/claim-intent.test.mts +0 -0
  49. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/opencode/src/code-memory-lib/claim-intent.ts +0 -0
  50. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/opencode/src/code-memory-lib/intent.ts +0 -0
  51. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/opencode/src/code-memory-lib/memory-client.ts +0 -0
  52. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/opencode/src/code-memory.ts +0 -0
  53. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/plugins/opencode/tsconfig.json +0 -0
  54. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/scripts/benchmark.py +0 -0
  55. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/scripts/benchmark_queries.json +0 -0
  56. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/scripts/benchmark_vs_baseline.py +0 -0
  57. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/scripts/benchmark_vs_grep.sh +0 -0
  58. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/scripts/ingest.py +0 -0
  59. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/scripts/install.ps1 +0 -0
  60. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/scripts/install.sh +0 -0
  61. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/claims/__init__.py +0 -0
  62. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/claims/extractor.py +0 -0
  63. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/claims/indexer.py +0 -0
  64. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/claims/resolver.py +0 -0
  65. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/claims/store.py +0 -0
  66. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/cli.py +0 -0
  67. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/config.py +0 -0
  68. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/embed/__init__.py +0 -0
  69. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/embed/cache.py +0 -0
  70. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/embed/m3.py +0 -0
  71. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/embed/ollama.py +0 -0
  72. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/embed/tei.py +0 -0
  73. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/episodic/__init__.py +0 -0
  74. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/episodic/sqlite_store.py +0 -0
  75. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/extractor/__init__.py +0 -0
  76. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/extractor/csproj.py +0 -0
  77. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/extractor/dll.py +0 -0
  78. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/extractor/gitignore.py +0 -0
  79. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/extractor/nuget.py +0 -0
  80. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/extractor/sanity.py +0 -0
  81. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/extractor/sln.py +0 -0
  82. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/extractor/treesitter.py +0 -0
  83. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/graph/__init__.py +0 -0
  84. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/graph/falkor_store.py +0 -0
  85. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/mcp_server.py +0 -0
  86. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/metrics.py +0 -0
  87. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/orchestrator/__init__.py +0 -0
  88. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/orchestrator/git_delta.py +0 -0
  89. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/orchestrator/ingest_state.py +0 -0
  90. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/orchestrator/pipeline.py +0 -0
  91. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/orchestrator/reset.py +0 -0
  92. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/orchestrator/resolver.py +0 -0
  93. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/orchestrator/retrieve.py +0 -0
  94. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/resilience.py +0 -0
  95. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/sync/__init__.py +0 -0
  96. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/sync/autostart/__init__.py +0 -0
  97. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/sync/autostart/base.py +0 -0
  98. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/sync/autostart/launchd.py +0 -0
  99. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/sync/autostart/schtasks.py +0 -0
  100. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/sync/autostart/systemd.py +0 -0
  101. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/sync/hooks.py +0 -0
  102. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/sync/safety.py +0 -0
  103. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/sync/snapshot.py +0 -0
  104. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/sync/store.py +0 -0
  105. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/sync/sync.py +0 -0
  106. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/sync/watcher.py +0 -0
  107. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/vector/__init__.py +0 -0
  108. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/src/code_memory/vector/qdrant_store.py +0 -0
  109. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_autostart_adapters.py +0 -0
  110. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_chunk_text.py +0 -0
  111. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_claim_extractor.py +0 -0
  112. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_claim_indexer.py +0 -0
  113. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_claim_resolver.py +0 -0
  114. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_claim_store.py +0 -0
  115. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_config_embed_dim.py +0 -0
  116. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_config_sentinel.py +0 -0
  117. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_csproj.py +0 -0
  118. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_dll_members.py +0 -0
  119. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_dll_parser.py +0 -0
  120. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_embed_backend.py +0 -0
  121. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_embed_cache.py +0 -0
  122. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_embed_m3.py +0 -0
  123. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_embed_tei.py +0 -0
  124. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_episode_dedup.py +0 -0
  125. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_episode_head_sha.py +0 -0
  126. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_extractor_csharp.py +0 -0
  127. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_extractor_filters.py +0 -0
  128. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_extractor_php.py +0 -0
  129. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_extractor_python_imports.py +0 -0
  130. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_extractor_receiver_type.py +0 -0
  131. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_extractor_references.py +0 -0
  132. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_extractor_sanity.py +0 -0
  133. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_extractor_ts_abstract.py +0 -0
  134. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_extractor_ts_inject.py +0 -0
  135. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_extractor_utf8.py +0 -0
  136. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_file_containment.py +0 -0
  137. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_git_delta.py +0 -0
  138. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_graph_queries.py +0 -0
  139. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_graph_temporal.py +0 -0
  140. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_graph_vacuum_at_sha.py +0 -0
  141. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_hooks_installer.py +0 -0
  142. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_ingest_state.py +0 -0
  143. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_mcp_assert_claim.py +0 -0
  144. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_mcp_server_descriptions.py +0 -0
  145. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_mcp_strict_project.py +0 -0
  146. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_metrics.py +0 -0
  147. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_nuget_resolver.py +0 -0
  148. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_overload_resolution.py +0 -0
  149. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_partial_class.py +0 -0
  150. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_pipeline_references.py +0 -0
  151. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_pipeline_temporal_wiring.py +0 -0
  152. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_qdrant_legacy_guard.py +0 -0
  153. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_razor_inject.py +0 -0
  154. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_resilience.py +0 -0
  155. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_resolver.py +0 -0
  156. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_resolver_assembly.py +0 -0
  157. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_retrieve_claims_surfacing.py +0 -0
  158. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_retrieve_rerank.py +0 -0
  159. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_sln.py +0 -0
  160. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_smoke.py +0 -0
  161. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_snapshot_e2e.py +0 -0
  162. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_snapshot_format.py +0 -0
  163. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_snapshot_store.py +0 -0
  164. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_sync_decision_tree.py +0 -0
  165. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_watch_safety.py +0 -0
  166. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_watcher_debouncer.py +0 -0
  167. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_watcher_exclude.py +0 -0
  168. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/tests/test_watcher_ref_events.py +0 -0
  169. {flurryx_code_memory-0.5.0 → flurryx_code_memory-0.5.1}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flurryx-code-memory
3
- Version: 0.5.0
3
+ Version: 0.5.1
4
4
  Summary: Local lightweight memory layer for coding agents: FalkorDB + Qdrant + Ollama (BGE-M3) + tree-sitter
5
5
  Requires-Python: >=3.11
6
6
  Requires-Dist: anyio>=4.4
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "flurryx-code-memory"
7
- version = "0.5.0"
7
+ version = "0.5.1"
8
8
  description = "Local lightweight memory layer for coding agents: FalkorDB + Qdrant + Ollama (BGE-M3) + tree-sitter"
9
9
  requires-python = ">=3.11"
10
10
  dependencies = [
@@ -0,0 +1,16 @@
1
+ from __future__ import annotations
2
+
3
+ from importlib.metadata import PackageNotFoundError, version as _pkg_version
4
+
5
+ # Two dist names exist in the wild:
6
+ # * "flurryx-code-memory" — current PyPI name (>= 0.4.0)
7
+ # * "code-memory" — legacy name used by uv-tool installs from git+main
8
+ # before the rename. Falls back to keep the older installs reporting
9
+ # a real version until they run `code-memory update --bleeding`.
10
+ __version__ = "0.0.0+local"
11
+ for _name in ("flurryx-code-memory", "code-memory"):
12
+ try:
13
+ __version__ = _pkg_version(_name)
14
+ break
15
+ except PackageNotFoundError:
16
+ continue
@@ -35,6 +35,8 @@ import httpx
35
35
  from . import __version__ as _LOCAL_VERSION
36
36
 
37
37
  PYPI_PACKAGE = "flurryx-code-memory"
38
+ LEGACY_PACKAGE = "code-memory" # historical dist name still in older uv-tool venvs
39
+ UV_TOOL_NAME = "code-memory" # entry-point/tool-name; what `uv tool list` shows
38
40
  DEFAULT_REPO_URL = os.environ.get(
39
41
  "CODEMEMORY_REPO_URL", "https://github.com/fmflurry/code-memory"
40
42
  )
@@ -108,21 +110,29 @@ def detect_install_method() -> InstallMethod:
108
110
 
109
111
 
110
112
  def _is_editable_install() -> bool:
111
- try:
112
- from importlib.metadata import distribution
113
+ from importlib.metadata import distribution
113
114
 
114
- d = distribution(PYPI_PACKAGE)
115
- raw = d.read_text("direct_url.json") or ""
115
+ for name in (PYPI_PACKAGE, LEGACY_PACKAGE):
116
+ try:
117
+ d = distribution(name)
118
+ except Exception: # noqa: BLE001
119
+ continue
120
+ try:
121
+ raw = d.read_text("direct_url.json") or ""
122
+ except Exception: # noqa: BLE001
123
+ raw = ""
116
124
  if not raw:
117
- return False
118
- return bool(json.loads(raw).get("dir_info", {}).get("editable"))
119
- except Exception: # noqa: BLE001
120
- return False
125
+ continue
126
+ if bool(json.loads(raw).get("dir_info", {}).get("editable")):
127
+ return True
128
+ return False
121
129
 
122
130
 
123
131
  def _pip_shows() -> bool:
124
- p = _run([sys.executable, "-m", "pip", "show", PYPI_PACKAGE])
125
- return p.returncode == 0
132
+ for name in (PYPI_PACKAGE, LEGACY_PACKAGE):
133
+ if _run([sys.executable, "-m", "pip", "show", name]).returncode == 0:
134
+ return True
135
+ return False
126
136
 
127
137
 
128
138
  def _ollama_models() -> list[str]:
@@ -152,6 +162,30 @@ def _docker_running(service: str) -> bool:
152
162
  return any(service in name for name in p.stdout.splitlines())
153
163
 
154
164
 
165
+ def _running_compose_file() -> Path | None:
166
+ """Probe live containers for the compose file that owns them.
167
+
168
+ Handles dev installs whose compose file lives in the repo, not under
169
+ ``~/.code-memory/docker/``. Returns the first compose path found
170
+ among ``cm-falkordb`` / ``cm-qdrant`` containers, or None.
171
+ """
172
+ if not _have("docker"):
173
+ return None
174
+ for name in ("cm-falkordb", "cm-qdrant"):
175
+ p = _run([
176
+ "docker",
177
+ "inspect",
178
+ "-f",
179
+ "{{ index .Config.Labels \"com.docker.compose.project.config_files\" }}",
180
+ name,
181
+ ])
182
+ if p.returncode == 0:
183
+ path = p.stdout.strip()
184
+ if path and Path(path).exists():
185
+ return Path(path)
186
+ return None
187
+
188
+
155
189
  def _claude_plugin_present() -> bool:
156
190
  if not _have("claude"):
157
191
  return False
@@ -251,17 +285,28 @@ def build_plan() -> UpdatePlan:
251
285
 
252
286
 
253
287
  def upgrade_cli(method: InstallMethod, *, bleeding: bool = False) -> tuple[bool, str]:
254
- """Upgrade the CLI in-place via the same channel it was installed from."""
288
+ """Upgrade the CLI in-place via the same channel it was installed from.
289
+
290
+ For uv-tool we always do a ``--reinstall --from <source>`` so legacy
291
+ installs whose dist is named ``code-memory`` (pre-rename) get cleanly
292
+ migrated to ``flurryx-code-memory`` without the user noticing.
293
+ """
255
294
  source = f"git+{DEFAULT_REPO_URL}" if bleeding else PYPI_PACKAGE
256
295
  if method == "uv-tool":
257
- if bleeding:
258
- cmd = ["uv", "tool", "install", "--force", "--from", source, "code-memory"]
259
- else:
260
- cmd = ["uv", "tool", "upgrade", PYPI_PACKAGE]
261
- elif method == "pipx":
262
- cmd = ["pipx", "upgrade", PYPI_PACKAGE] if not bleeding else [
263
- "pipx", "install", "--force", source
296
+ cmd = [
297
+ "uv",
298
+ "tool",
299
+ "install",
300
+ "--reinstall",
301
+ "--force",
302
+ "--from",
303
+ source,
304
+ UV_TOOL_NAME,
264
305
  ]
306
+ elif method == "pipx":
307
+ # pipx-installed users likely registered under either name; force
308
+ # a reinstall from <source> so the package name converges to current.
309
+ cmd = ["pipx", "install", "--force", source]
265
310
  elif method == "pip":
266
311
  cmd = [sys.executable, "-m", "pip", "install", "--upgrade", source]
267
312
  elif method == "editable":
@@ -273,20 +318,27 @@ def upgrade_cli(method: InstallMethod, *, bleeding: bool = False) -> tuple[bool,
273
318
 
274
319
 
275
320
  def upgrade_docker_images() -> tuple[bool, str]:
276
- if not _docker_compose_present() or not _have("docker"):
277
- return False, "skipped (no compose / docker)"
321
+ if not _have("docker"):
322
+ return False, "docker not on PATH"
278
323
  compose = CODEMEMORY_HOME / "docker" / "docker-compose.yml"
324
+ project_dir = CODEMEMORY_HOME
325
+ if not compose.exists():
326
+ live = _running_compose_file()
327
+ if live is None:
328
+ return False, "no compose file at ~/.code-memory/ and no running cm-* containers"
329
+ compose = live
330
+ project_dir = live.parent.parent if live.parent.name == "docker" else live.parent
279
331
  pull = _run(
280
- ["docker", "compose", "-f", str(compose), "--project-directory", str(CODEMEMORY_HOME), "pull"],
332
+ ["docker", "compose", "-f", str(compose), "--project-directory", str(project_dir), "pull"],
281
333
  capture=False,
282
334
  )
283
335
  if pull.returncode != 0:
284
336
  return False, "docker compose pull failed"
285
337
  up = _run(
286
- ["docker", "compose", "-f", str(compose), "--project-directory", str(CODEMEMORY_HOME), "up", "-d"],
338
+ ["docker", "compose", "-f", str(compose), "--project-directory", str(project_dir), "up", "-d"],
287
339
  capture=False,
288
340
  )
289
- return up.returncode == 0, "compose pulled + up"
341
+ return up.returncode == 0, f"compose pulled + up ({compose})"
290
342
 
291
343
 
292
344
  def upgrade_ollama_model(model: str) -> tuple[bool, str]:
@@ -299,12 +351,17 @@ def upgrade_ollama_model(model: str) -> tuple[bool, str]:
299
351
  def upgrade_claude_plugin() -> tuple[bool, str]:
300
352
  if not _have("claude"):
301
353
  return False, "claude CLI not on PATH"
302
- # `claude plugin install` is idempotent re-pin to latest from marketplace
303
- p = _run(
304
- ["claude", "plugin", "install", "code-memory@code-memory", "--scope", "user", "--force"],
354
+ # `claude plugin update <name>` is the canonical refresh path.
355
+ # `--force` was a previous-version flag; current CLI rejects it.
356
+ p = _run(["claude", "plugin", "update", "code-memory@code-memory"], capture=False)
357
+ if p.returncode == 0:
358
+ return True, "claude plugin updated"
359
+ # Fall back to install — handles the never-installed-after-marketplace-add edge.
360
+ p2 = _run(
361
+ ["claude", "plugin", "install", "code-memory@code-memory", "--scope", "user"],
305
362
  capture=False,
306
363
  )
307
- return p.returncode == 0, "claude plugin refreshed"
364
+ return p2.returncode == 0, "claude plugin re-installed"
308
365
 
309
366
 
310
367
  def upgrade_npm_pkg(pkg: str = "code-memory-opencode") -> tuple[bool, str]:
@@ -1,8 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from importlib.metadata import PackageNotFoundError, version as _pkg_version
4
-
5
- try:
6
- __version__ = _pkg_version("flurryx-code-memory")
7
- except PackageNotFoundError: # editable / source checkout without install
8
- __version__ = "0.0.0+local"