flurryx-code-memory 0.6.0__tar.gz → 0.6.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.
Files changed (189) hide show
  1. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/PKG-INFO +1 -1
  2. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/scripts/on-post-tool.js +11 -0
  3. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/scripts/on-after-file-edit.js +11 -0
  4. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/opencode/src/code-memory.ts +11 -0
  5. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/pyproject.toml +1 -1
  6. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/scripts/install.ps1 +19 -3
  7. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/scripts/install.sh +16 -2
  8. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/updater.py +85 -12
  9. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/.claude-plugin/marketplace.json +0 -0
  10. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/.env.example +0 -0
  11. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/.gitignore +0 -0
  12. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/CHANGELOG.md +0 -0
  13. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/README.md +0 -0
  14. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/docker/docker-compose.yml +0 -0
  15. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/docs/BENCHMARK.md +0 -0
  16. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/docs/BENCHMARK_VS_BASELINE.json +0 -0
  17. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/docs/BENCHMARK_VS_BASELINE.md +0 -0
  18. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/docs/architecture.png +0 -0
  19. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/docs/benchmark-raw.json +0 -0
  20. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/docs/hero.png +0 -0
  21. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/install.ps1 +0 -0
  22. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/install.sh +0 -0
  23. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  24. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/README.md +0 -0
  25. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/commands/code-memory.md +0 -0
  26. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/hooks/hooks.json +0 -0
  27. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/install.sh +0 -0
  28. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/scripts/lib/claim-intent.js +0 -0
  29. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/scripts/lib/claim-intent.test.js +0 -0
  30. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/scripts/lib/io.js +0 -0
  31. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/scripts/lib/memory.js +0 -0
  32. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/scripts/lib/state.js +0 -0
  33. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/scripts/on-pre-tool.js +0 -0
  34. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/scripts/on-retrieve-seen.js +0 -0
  35. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/scripts/on-session-start.js +0 -0
  36. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/scripts/on-stop.js +0 -0
  37. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/scripts/on-user-prompt.js +0 -0
  38. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/scripts/resolver-debounce.js +0 -0
  39. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/claude-code/skills/code-memory/SKILL.md +0 -0
  40. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/README.md +0 -0
  41. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/hooks/hooks.json.template +0 -0
  42. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/install.sh +0 -0
  43. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/rules/code-memory.mdc +0 -0
  44. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/scripts/lib/claim-intent.js +0 -0
  45. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/scripts/lib/claim-intent.test.js +0 -0
  46. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/scripts/lib/io.js +0 -0
  47. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/scripts/lib/memory.js +0 -0
  48. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/scripts/lib/state.js +0 -0
  49. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/scripts/on-before-mcp-execution.js +0 -0
  50. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/scripts/on-before-submit-prompt.js +0 -0
  51. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/scripts/on-post-tool-use.js +0 -0
  52. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/scripts/on-pre-compact.js +0 -0
  53. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/scripts/on-pre-tool-use.js +0 -0
  54. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/scripts/on-session-end.js +0 -0
  55. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/scripts/on-session-start.js +0 -0
  56. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/scripts/on-stop.js +0 -0
  57. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/cursor/scripts/resolver-debounce.js +0 -0
  58. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/opencode/README.md +0 -0
  59. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/opencode/install.sh +0 -0
  60. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/opencode/package-lock.json +0 -0
  61. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/opencode/package.json +0 -0
  62. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/opencode/scripts/add-mcp.py +0 -0
  63. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/opencode/scripts/install.mjs +0 -0
  64. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/opencode/scripts/uninstall.mjs +0 -0
  65. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/opencode/skills/code-memory/SKILL.md +0 -0
  66. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/opencode/src/code-memory-lib/claim-intent.test.mts +0 -0
  67. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/opencode/src/code-memory-lib/claim-intent.ts +0 -0
  68. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/opencode/src/code-memory-lib/memory-client.ts +0 -0
  69. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/opencode/tsconfig.json +0 -0
  70. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/vibe/README.md +0 -0
  71. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/vibe/install.sh +0 -0
  72. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/plugins/vibe/skills/code-memory/SKILL.md +0 -0
  73. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/scripts/benchmark.py +0 -0
  74. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/scripts/benchmark_queries.json +0 -0
  75. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/scripts/benchmark_vs_baseline.py +0 -0
  76. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/scripts/benchmark_vs_grep.sh +0 -0
  77. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/scripts/ingest.py +0 -0
  78. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/__init__.py +0 -0
  79. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/claims/__init__.py +0 -0
  80. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/claims/extractor.py +0 -0
  81. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/claims/indexer.py +0 -0
  82. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/claims/resolver.py +0 -0
  83. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/claims/store.py +0 -0
  84. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/cli.py +0 -0
  85. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/config.py +0 -0
  86. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/embed/__init__.py +0 -0
  87. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/embed/cache.py +0 -0
  88. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/embed/m3.py +0 -0
  89. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/embed/ollama.py +0 -0
  90. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/embed/tei.py +0 -0
  91. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/episodic/__init__.py +0 -0
  92. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/episodic/sqlite_store.py +0 -0
  93. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/extractor/__init__.py +0 -0
  94. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/extractor/csproj.py +0 -0
  95. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/extractor/dll.py +0 -0
  96. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/extractor/gitignore.py +0 -0
  97. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/extractor/nuget.py +0 -0
  98. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/extractor/sanity.py +0 -0
  99. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/extractor/sln.py +0 -0
  100. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/extractor/treesitter.py +0 -0
  101. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/graph/__init__.py +0 -0
  102. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/graph/falkor_store.py +0 -0
  103. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/mcp_server.py +0 -0
  104. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/metrics.py +0 -0
  105. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/orchestrator/__init__.py +0 -0
  106. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/orchestrator/git_delta.py +0 -0
  107. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/orchestrator/ingest_state.py +0 -0
  108. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/orchestrator/pipeline.py +0 -0
  109. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/orchestrator/reset.py +0 -0
  110. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/orchestrator/resolver.py +0 -0
  111. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/orchestrator/retrieve.py +0 -0
  112. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/resilience.py +0 -0
  113. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/sync/__init__.py +0 -0
  114. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/sync/autostart/__init__.py +0 -0
  115. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/sync/autostart/base.py +0 -0
  116. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/sync/autostart/launchd.py +0 -0
  117. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/sync/autostart/schtasks.py +0 -0
  118. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/sync/autostart/systemd.py +0 -0
  119. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/sync/hooks.py +0 -0
  120. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/sync/safety.py +0 -0
  121. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/sync/snapshot.py +0 -0
  122. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/sync/store.py +0 -0
  123. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/sync/sync.py +0 -0
  124. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/sync/watcher.py +0 -0
  125. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/vector/__init__.py +0 -0
  126. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/src/code_memory/vector/qdrant_store.py +0 -0
  127. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_autostart_adapters.py +0 -0
  128. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_chunk_text.py +0 -0
  129. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_claim_extractor.py +0 -0
  130. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_claim_indexer.py +0 -0
  131. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_claim_resolver.py +0 -0
  132. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_claim_store.py +0 -0
  133. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_config_embed_dim.py +0 -0
  134. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_config_sentinel.py +0 -0
  135. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_csproj.py +0 -0
  136. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_dll_members.py +0 -0
  137. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_dll_parser.py +0 -0
  138. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_embed_backend.py +0 -0
  139. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_embed_cache.py +0 -0
  140. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_embed_m3.py +0 -0
  141. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_embed_tei.py +0 -0
  142. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_episode_dedup.py +0 -0
  143. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_episode_head_sha.py +0 -0
  144. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_extractor_csharp.py +0 -0
  145. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_extractor_dart.py +0 -0
  146. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_extractor_filters.py +0 -0
  147. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_extractor_php.py +0 -0
  148. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_extractor_python_imports.py +0 -0
  149. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_extractor_receiver_type.py +0 -0
  150. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_extractor_references.py +0 -0
  151. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_extractor_sanity.py +0 -0
  152. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_extractor_ts_abstract.py +0 -0
  153. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_extractor_ts_inject.py +0 -0
  154. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_extractor_utf8.py +0 -0
  155. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_file_containment.py +0 -0
  156. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_git_delta.py +0 -0
  157. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_graph_queries.py +0 -0
  158. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_graph_temporal.py +0 -0
  159. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_graph_vacuum_at_sha.py +0 -0
  160. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_hooks_installer.py +0 -0
  161. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_ingest_state.py +0 -0
  162. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_mcp_assert_claim.py +0 -0
  163. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_mcp_server_descriptions.py +0 -0
  164. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_mcp_shutdown.py +0 -0
  165. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_mcp_strict_project.py +0 -0
  166. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_metrics.py +0 -0
  167. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_nuget_resolver.py +0 -0
  168. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_overload_resolution.py +0 -0
  169. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_partial_class.py +0 -0
  170. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_pipeline_references.py +0 -0
  171. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_pipeline_temporal_wiring.py +0 -0
  172. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_qdrant_legacy_guard.py +0 -0
  173. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_razor_inject.py +0 -0
  174. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_resilience.py +0 -0
  175. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_resolver.py +0 -0
  176. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_resolver_assembly.py +0 -0
  177. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_retrieve_claims_surfacing.py +0 -0
  178. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_retrieve_rerank.py +0 -0
  179. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_sln.py +0 -0
  180. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_smoke.py +0 -0
  181. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_snapshot_e2e.py +0 -0
  182. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_snapshot_format.py +0 -0
  183. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_snapshot_store.py +0 -0
  184. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_sync_decision_tree.py +0 -0
  185. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_watch_safety.py +0 -0
  186. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_watcher_debouncer.py +0 -0
  187. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_watcher_exclude.py +0 -0
  188. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/tests/test_watcher_ref_events.py +0 -0
  189. {flurryx_code_memory-0.6.0 → flurryx_code_memory-0.6.2}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flurryx-code-memory
3
- Version: 0.6.0
3
+ Version: 0.6.2
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
@@ -51,6 +51,17 @@ function pickPath(obj) {
51
51
  return;
52
52
  }
53
53
 
54
+ // Guard: only reingest files that live inside the project root (cwd).
55
+ // Resolving against cwd handles relative paths; the sep-suffix check
56
+ // prevents false positives like /foo/bar matching the prefix of /foo/baz.
57
+ const projectRoot = path.resolve(cwd);
58
+ const absFilePath = path.resolve(cwd, filePath);
59
+ if (absFilePath !== projectRoot && !absFilePath.startsWith(projectRoot + path.sep)) {
60
+ // File is outside the project — silently skip ingestion.
61
+ done();
62
+ return;
63
+ }
64
+
54
65
  const mem = await createMemoryClient({ cwd, log: () => {} });
55
66
  if (!mem.available) {
56
67
  done();
@@ -32,6 +32,17 @@ const { touchResolverMarker } = require("./lib/state");
32
32
  process.env.CURSOR_PROJECT_DIR ||
33
33
  process.cwd();
34
34
 
35
+ // Guard: only reingest files that live inside the project root (cwd).
36
+ // Resolving against cwd handles relative paths; the sep-suffix check
37
+ // prevents false positives like /foo/bar matching the prefix of /foo/baz.
38
+ const projectRoot = path.resolve(cwd);
39
+ const absFilePath = path.resolve(cwd, filePath);
40
+ if (absFilePath !== projectRoot && !absFilePath.startsWith(projectRoot + path.sep)) {
41
+ // File is outside the project — silently skip ingestion.
42
+ done();
43
+ return;
44
+ }
45
+
35
46
  const mem = await createMemoryClient({ cwd, log: () => {} });
36
47
  if (!mem.available) {
37
48
  done();
@@ -15,6 +15,7 @@
15
15
 
16
16
  import { execFile as execFileCb } from "node:child_process";
17
17
  import { promisify } from "node:util";
18
+ import * as nodePath from "node:path";
18
19
 
19
20
  import type { Plugin } from "@opencode-ai/plugin";
20
21
 
@@ -324,6 +325,16 @@ const CodeMemoryPlugin: Plugin = async ({ client, directory, worktree }) => {
324
325
  const path = pickToolPath(output.args) ?? pickToolPath(output.metadata);
325
326
  if (!path) return;
326
327
 
328
+ // Guard: only reingest files that live inside the project root (cwd).
329
+ // Resolving against cwd handles relative paths; the sep-suffix check
330
+ // prevents false positives like /foo/bar matching the prefix of /foo/baz.
331
+ const projectRoot = nodePath.resolve(cwd);
332
+ const absPath = nodePath.resolve(cwd, path);
333
+ if (absPath !== projectRoot && !absPath.startsWith(projectRoot + nodePath.sep)) {
334
+ // File is outside the project — silently skip ingestion.
335
+ return;
336
+ }
337
+
327
338
  // 1. Re-ingest the single file (fast, background).
328
339
  void memory.reingest(path);
329
340
 
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "flurryx-code-memory"
7
- version = "0.6.0"
7
+ version = "0.6.2"
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 = [
@@ -204,9 +204,25 @@ if (-not (Test-Path '.env')) {
204
204
  # ---------- 5. docker infra ----------
205
205
  if (-not $NoDocker) {
206
206
  Step "Starting FalkorDB + Qdrant (docker compose)"
207
- & docker compose -f docker/docker-compose.yml up -d
208
- if ($LASTEXITCODE -ne 0) { Die "docker compose up failed" }
209
- Ok "Containers up"
207
+ # Pin an explicit project name. The compose file uses fixed container_names
208
+ # (cm-falkordb, ...), so they are global singletons: a later `compose up`
209
+ # under a different project name collides with "container name already in
210
+ # use". Reuse whatever project already owns the running containers (so their
211
+ # data volumes, namespaced as <project>_falkor_data, stay attached); fall
212
+ # back to a stable name for fresh installs. This keeps install and
213
+ # `code-memory update` on one project without ever orphaning indexed data.
214
+ $CmProject = (& docker inspect -f '{{ index .Config.Labels "com.docker.compose.project" }}' cm-falkordb 2>$null)
215
+ if (-not $CmProject) { $CmProject = (& docker inspect -f '{{ index .Config.Labels "com.docker.compose.project" }}' cm-qdrant 2>$null) }
216
+ if (-not $CmProject) { $CmProject = "code-memory" }
217
+ $CmProject = "$CmProject".Trim()
218
+ & docker compose -p $CmProject -f docker/docker-compose.yml up -d --remove-orphans
219
+ if ($LASTEXITCODE -ne 0) {
220
+ Warn "compose up hit a container-name conflict — removing stale cm-* containers and retrying (named volumes persist)"
221
+ & docker rm -f cm-falkordb cm-qdrant cm-tei *> $null
222
+ & docker compose -p $CmProject -f docker/docker-compose.yml up -d --remove-orphans
223
+ if ($LASTEXITCODE -ne 0) { Die "docker compose up failed" }
224
+ }
225
+ Ok "Containers up (project: $CmProject)"
210
226
  Dim "FalkorDB browser: http://localhost:3000"
211
227
  Dim "Qdrant dashboard: http://localhost:6333/dashboard"
212
228
  } else {
@@ -220,8 +220,22 @@ fi
220
220
  # ---------- 5. docker infra ----------
221
221
  if [ "$SKIP_DOCKER" -eq 0 ]; then
222
222
  step "Starting FalkorDB + Qdrant (docker compose)"
223
- docker compose -f docker/docker-compose.yml up -d
224
- ok "Containers up"
223
+ # Pin an explicit project name. The compose file uses fixed container_names
224
+ # (cm-falkordb, ...), so they are global singletons: a later `compose up`
225
+ # under a different project name collides with "container name already in
226
+ # use". Reuse whatever project already owns the running containers (so their
227
+ # data volumes, namespaced as <project>_falkor_data, stay attached); fall
228
+ # back to a stable name for fresh installs. This keeps install and
229
+ # `code-memory update` on one project without ever orphaning indexed data.
230
+ CM_PROJECT="$(docker inspect -f '{{ index .Config.Labels "com.docker.compose.project" }}' cm-falkordb 2>/dev/null || true)"
231
+ [ -z "$CM_PROJECT" ] && CM_PROJECT="$(docker inspect -f '{{ index .Config.Labels "com.docker.compose.project" }}' cm-qdrant 2>/dev/null || true)"
232
+ [ -z "$CM_PROJECT" ] && CM_PROJECT="code-memory"
233
+ if ! docker compose -p "$CM_PROJECT" -f docker/docker-compose.yml up -d --remove-orphans; then
234
+ warn "compose up hit a container-name conflict — removing stale cm-* containers and retrying (named volumes persist)"
235
+ docker rm -f cm-falkordb cm-qdrant cm-tei >/dev/null 2>&1 || true
236
+ docker compose -p "$CM_PROJECT" -f docker/docker-compose.yml up -d --remove-orphans || die "docker compose up failed"
237
+ fi
238
+ ok "Containers up (project: $CM_PROJECT)"
225
239
  printf "${DIM} FalkorDB browser: http://localhost:3000\n Qdrant dashboard: http://localhost:6333/dashboard${RST}\n"
226
240
  else
227
241
  warn "Docker step skipped"
@@ -42,6 +42,16 @@ DEFAULT_REPO_URL = os.environ.get(
42
42
  )
43
43
  CODEMEMORY_HOME = Path(os.environ.get("CODEMEMORY_HOME", str(Path.home() / ".code-memory")))
44
44
 
45
+ # Stable compose project name. The compose file pins fixed container_names
46
+ # (``cm-falkordb`` etc.), so the containers are global singletons: only the
47
+ # compose project that originally created them may recreate them. If a later
48
+ # ``compose up`` runs under a *different* project name, Docker refuses with
49
+ # "container name already in use". We therefore always pin ``-p`` to one
50
+ # constant and, when containers already exist, to whatever project actually
51
+ # owns them — so update never collides with install.
52
+ COMPOSE_PROJECT = "code-memory"
53
+ COMPOSE_CONTAINERS = ("cm-falkordb", "cm-qdrant", "cm-tei")
54
+
45
55
  InstallMethod = Literal["uv-tool", "pipx", "pip", "editable", "unknown"]
46
56
 
47
57
 
@@ -83,8 +93,17 @@ class UpdatePlan:
83
93
 
84
94
 
85
95
  def _run(cmd: list[str], *, check: bool = False, capture: bool = True) -> subprocess.CompletedProcess[str]:
96
+ # On Windows the CLIs we shell out to (npm, claude) ship as .cmd batch
97
+ # files. CreateProcess only resolves .exe images by the bare name, so
98
+ # ``["npm", ...]`` raises WinError 2 even though it is on PATH. Resolve the
99
+ # real path via PATHEXT-aware which(), and run batch files through cmd.exe.
100
+ resolved = shutil.which(cmd[0]) or cmd[0]
101
+ args = [resolved, *cmd[1:]]
102
+ if os.name == "nt" and resolved.lower().endswith((".cmd", ".bat")):
103
+ comspec = os.environ.get("COMSPEC", "cmd.exe")
104
+ args = [comspec, "/c", *args]
86
105
  return subprocess.run(
87
- cmd, check=check, capture_output=capture, text=True, env={**os.environ}
106
+ args, check=check, capture_output=capture, text=True, env={**os.environ}
88
107
  )
89
108
 
90
109
 
@@ -203,6 +222,44 @@ def _running_compose_file() -> Path | None:
203
222
  return None
204
223
 
205
224
 
225
+ def _owning_compose_project() -> str | None:
226
+ """Compose project name that already owns the cm-* containers, if any.
227
+
228
+ Reading the live ``com.docker.compose.project`` label lets the updater
229
+ recreate the existing containers under their original project instead of
230
+ guessing a name from a directory basename (which is what caused the
231
+ "container name already in use" conflict).
232
+ """
233
+ if not _have("docker"):
234
+ return None
235
+ for name in ("cm-falkordb", "cm-qdrant"):
236
+ p = _run([
237
+ "docker",
238
+ "inspect",
239
+ "-f",
240
+ "{{ index .Config.Labels \"com.docker.compose.project\" }}",
241
+ name,
242
+ ])
243
+ if p.returncode == 0:
244
+ proj = p.stdout.strip()
245
+ if proj:
246
+ return proj
247
+ return None
248
+
249
+
250
+ def _remove_conflicting_containers() -> None:
251
+ """Force-remove the fixed-name cm-* containers.
252
+
253
+ Last-resort recovery when ``compose up`` still hits a name conflict (e.g.
254
+ the existing containers carry no compose project label, or an unmanaged
255
+ container squatted the name). Named volumes (falkor_data, qdrant_data,
256
+ tei_data) survive ``rm``, so indexed data is preserved.
257
+ """
258
+ if not _have("docker"):
259
+ return
260
+ _run(["docker", "rm", "-f", *COMPOSE_CONTAINERS])
261
+
262
+
206
263
  def _claude_plugin_present() -> bool:
207
264
  if not _have("claude"):
208
265
  return False
@@ -338,24 +395,40 @@ def upgrade_docker_images() -> tuple[bool, str]:
338
395
  if not _have("docker"):
339
396
  return False, "docker not on PATH"
340
397
  compose = CODEMEMORY_HOME / "docker" / "docker-compose.yml"
341
- project_dir = CODEMEMORY_HOME
342
398
  if not compose.exists():
343
399
  live = _running_compose_file()
344
400
  if live is None:
345
401
  return False, "no compose file at ~/.code-memory/ and no running cm-* containers"
346
402
  compose = live
347
- project_dir = live.parent
348
- pull = _run(
349
- ["docker", "compose", "-f", str(compose), "--project-directory", str(project_dir), "pull"],
350
- capture=False,
351
- )
403
+ project_dir = compose.parent
404
+
405
+ # Pin the project name so naming never depends on the directory basename.
406
+ # Prefer the project the running containers already belong to — that is the
407
+ # only project allowed to recreate the fixed-name cm-* containers, so using
408
+ # it sidesteps the "container name already in use" conflict.
409
+ project = _owning_compose_project() or COMPOSE_PROJECT
410
+
411
+ base = [
412
+ "docker", "compose",
413
+ "-f", str(compose),
414
+ "--project-directory", str(project_dir),
415
+ "-p", project,
416
+ ]
417
+
418
+ pull = _run([*base, "pull"], capture=False)
352
419
  if pull.returncode != 0:
353
420
  return False, "docker compose pull failed"
354
- up = _run(
355
- ["docker", "compose", "-f", str(compose), "--project-directory", str(project_dir), "up", "-d"],
356
- capture=False,
357
- )
358
- return up.returncode == 0, f"compose pulled + up ({compose})"
421
+
422
+ up = _run([*base, "up", "-d", "--remove-orphans"], capture=False)
423
+ if up.returncode == 0:
424
+ return True, f"compose pulled + up (project={project}, {compose})"
425
+
426
+ # Recovery: a stale or unmanaged container is squatting the fixed name.
427
+ # Drop the cm-* containers (named volumes persist) and recreate cleanly.
428
+ print(" Docker: name conflict — removing stale cm-* containers and retrying")
429
+ _remove_conflicting_containers()
430
+ up_retry = _run([*base, "up", "-d", "--remove-orphans"], capture=False)
431
+ return up_retry.returncode == 0, f"compose recreated after conflict (project={project}, {compose})"
359
432
 
360
433
 
361
434
  def upgrade_ollama_model(model: str) -> tuple[bool, str]: