flurryx-code-memory 0.5.2__tar.gz → 0.6.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 (190) hide show
  1. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/CHANGELOG.md +75 -0
  2. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/PKG-INFO +1 -1
  3. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/README.md +1 -0
  4. flurryx_code_memory-0.6.1/plugins/vibe/README.md +117 -0
  5. flurryx_code_memory-0.6.1/plugins/vibe/install.sh +184 -0
  6. flurryx_code_memory-0.6.1/plugins/vibe/skills/code-memory/SKILL.md +62 -0
  7. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/pyproject.toml +1 -1
  8. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/scripts/install.ps1 +39 -14
  9. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/scripts/install.sh +40 -8
  10. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/treesitter.py +538 -11
  11. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/store.py +47 -2
  12. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/updater.py +85 -12
  13. flurryx_code_memory-0.6.1/tests/test_extractor_dart.py +151 -0
  14. flurryx_code_memory-0.6.1/tests/test_extractor_receiver_type.py +192 -0
  15. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/uv.lock +1 -1
  16. flurryx_code_memory-0.5.2/tests/test_extractor_receiver_type.py +0 -98
  17. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/.claude-plugin/marketplace.json +0 -0
  18. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/.env.example +0 -0
  19. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/.gitignore +0 -0
  20. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/docker/docker-compose.yml +0 -0
  21. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/docs/BENCHMARK.md +0 -0
  22. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/docs/BENCHMARK_VS_BASELINE.json +0 -0
  23. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/docs/BENCHMARK_VS_BASELINE.md +0 -0
  24. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/docs/architecture.png +0 -0
  25. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/docs/benchmark-raw.json +0 -0
  26. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/docs/hero.png +0 -0
  27. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/install.ps1 +0 -0
  28. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/install.sh +0 -0
  29. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
  30. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/README.md +0 -0
  31. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/commands/code-memory.md +0 -0
  32. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/hooks/hooks.json +0 -0
  33. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/install.sh +0 -0
  34. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/lib/claim-intent.js +0 -0
  35. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/lib/claim-intent.test.js +0 -0
  36. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/lib/io.js +0 -0
  37. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/lib/memory.js +0 -0
  38. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/lib/state.js +0 -0
  39. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/on-post-tool.js +0 -0
  40. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/on-pre-tool.js +0 -0
  41. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/on-retrieve-seen.js +0 -0
  42. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/on-session-start.js +0 -0
  43. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/on-stop.js +0 -0
  44. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/on-user-prompt.js +0 -0
  45. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/resolver-debounce.js +0 -0
  46. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/skills/code-memory/SKILL.md +0 -0
  47. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/README.md +0 -0
  48. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/hooks/hooks.json.template +0 -0
  49. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/install.sh +0 -0
  50. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/rules/code-memory.mdc +0 -0
  51. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/lib/claim-intent.js +0 -0
  52. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/lib/claim-intent.test.js +0 -0
  53. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/lib/io.js +0 -0
  54. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/lib/memory.js +0 -0
  55. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/lib/state.js +0 -0
  56. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-after-file-edit.js +0 -0
  57. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-before-mcp-execution.js +0 -0
  58. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-before-submit-prompt.js +0 -0
  59. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-post-tool-use.js +0 -0
  60. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-pre-compact.js +0 -0
  61. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-pre-tool-use.js +0 -0
  62. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-session-end.js +0 -0
  63. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-session-start.js +0 -0
  64. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-stop.js +0 -0
  65. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/resolver-debounce.js +0 -0
  66. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/README.md +0 -0
  67. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/install.sh +0 -0
  68. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/package-lock.json +0 -0
  69. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/package.json +0 -0
  70. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/scripts/add-mcp.py +0 -0
  71. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/scripts/install.mjs +0 -0
  72. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/scripts/uninstall.mjs +0 -0
  73. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/skills/code-memory/SKILL.md +0 -0
  74. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/src/code-memory-lib/claim-intent.test.mts +0 -0
  75. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/src/code-memory-lib/claim-intent.ts +0 -0
  76. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/src/code-memory-lib/memory-client.ts +0 -0
  77. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/src/code-memory.ts +0 -0
  78. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/tsconfig.json +0 -0
  79. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/scripts/benchmark.py +0 -0
  80. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/scripts/benchmark_queries.json +0 -0
  81. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/scripts/benchmark_vs_baseline.py +0 -0
  82. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/scripts/benchmark_vs_grep.sh +0 -0
  83. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/scripts/ingest.py +0 -0
  84. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/__init__.py +0 -0
  85. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/claims/__init__.py +0 -0
  86. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/claims/extractor.py +0 -0
  87. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/claims/indexer.py +0 -0
  88. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/claims/resolver.py +0 -0
  89. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/claims/store.py +0 -0
  90. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/cli.py +0 -0
  91. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/config.py +0 -0
  92. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/embed/__init__.py +0 -0
  93. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/embed/cache.py +0 -0
  94. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/embed/m3.py +0 -0
  95. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/embed/ollama.py +0 -0
  96. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/embed/tei.py +0 -0
  97. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/episodic/__init__.py +0 -0
  98. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/episodic/sqlite_store.py +0 -0
  99. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/__init__.py +0 -0
  100. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/csproj.py +0 -0
  101. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/dll.py +0 -0
  102. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/gitignore.py +0 -0
  103. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/nuget.py +0 -0
  104. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/sanity.py +0 -0
  105. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/sln.py +0 -0
  106. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/graph/__init__.py +0 -0
  107. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/graph/falkor_store.py +0 -0
  108. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/mcp_server.py +0 -0
  109. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/metrics.py +0 -0
  110. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/orchestrator/__init__.py +0 -0
  111. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/orchestrator/git_delta.py +0 -0
  112. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/orchestrator/ingest_state.py +0 -0
  113. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/orchestrator/pipeline.py +0 -0
  114. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/orchestrator/reset.py +0 -0
  115. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/orchestrator/resolver.py +0 -0
  116. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/orchestrator/retrieve.py +0 -0
  117. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/resilience.py +0 -0
  118. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/__init__.py +0 -0
  119. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/autostart/__init__.py +0 -0
  120. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/autostart/base.py +0 -0
  121. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/autostart/launchd.py +0 -0
  122. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/autostart/schtasks.py +0 -0
  123. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/autostart/systemd.py +0 -0
  124. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/hooks.py +0 -0
  125. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/safety.py +0 -0
  126. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/snapshot.py +0 -0
  127. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/sync.py +0 -0
  128. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/watcher.py +0 -0
  129. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/vector/__init__.py +0 -0
  130. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/vector/qdrant_store.py +0 -0
  131. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_autostart_adapters.py +0 -0
  132. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_chunk_text.py +0 -0
  133. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_claim_extractor.py +0 -0
  134. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_claim_indexer.py +0 -0
  135. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_claim_resolver.py +0 -0
  136. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_claim_store.py +0 -0
  137. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_config_embed_dim.py +0 -0
  138. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_config_sentinel.py +0 -0
  139. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_csproj.py +0 -0
  140. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_dll_members.py +0 -0
  141. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_dll_parser.py +0 -0
  142. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_embed_backend.py +0 -0
  143. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_embed_cache.py +0 -0
  144. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_embed_m3.py +0 -0
  145. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_embed_tei.py +0 -0
  146. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_episode_dedup.py +0 -0
  147. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_episode_head_sha.py +0 -0
  148. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_csharp.py +0 -0
  149. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_filters.py +0 -0
  150. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_php.py +0 -0
  151. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_python_imports.py +0 -0
  152. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_references.py +0 -0
  153. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_sanity.py +0 -0
  154. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_ts_abstract.py +0 -0
  155. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_ts_inject.py +0 -0
  156. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_utf8.py +0 -0
  157. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_file_containment.py +0 -0
  158. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_git_delta.py +0 -0
  159. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_graph_queries.py +0 -0
  160. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_graph_temporal.py +0 -0
  161. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_graph_vacuum_at_sha.py +0 -0
  162. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_hooks_installer.py +0 -0
  163. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_ingest_state.py +0 -0
  164. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_mcp_assert_claim.py +0 -0
  165. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_mcp_server_descriptions.py +0 -0
  166. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_mcp_shutdown.py +0 -0
  167. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_mcp_strict_project.py +0 -0
  168. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_metrics.py +0 -0
  169. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_nuget_resolver.py +0 -0
  170. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_overload_resolution.py +0 -0
  171. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_partial_class.py +0 -0
  172. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_pipeline_references.py +0 -0
  173. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_pipeline_temporal_wiring.py +0 -0
  174. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_qdrant_legacy_guard.py +0 -0
  175. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_razor_inject.py +0 -0
  176. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_resilience.py +0 -0
  177. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_resolver.py +0 -0
  178. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_resolver_assembly.py +0 -0
  179. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_retrieve_claims_surfacing.py +0 -0
  180. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_retrieve_rerank.py +0 -0
  181. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_sln.py +0 -0
  182. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_smoke.py +0 -0
  183. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_snapshot_e2e.py +0 -0
  184. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_snapshot_format.py +0 -0
  185. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_snapshot_store.py +0 -0
  186. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_sync_decision_tree.py +0 -0
  187. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_watch_safety.py +0 -0
  188. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_watcher_debouncer.py +0 -0
  189. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_watcher_exclude.py +0 -0
  190. {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_watcher_ref_events.py +0 -0
@@ -8,6 +8,81 @@ when the repo grows.
8
8
  This file complements `git log`: commits explain mechanics, this file
9
9
  explains intent.
10
10
 
11
+ ## [0.6.0] — 2026-06-04
12
+
13
+ Release theme: **Dart joins the graph, and `this.field.method()` resolves
14
+ across languages**. The extractor gains a ninth language and the
15
+ receiver-type tier — previously TypeScript-only — now narrows method
16
+ calls in C#, PHP, and Dart too.
17
+
18
+ ### Added — Dart / Flutter language support
19
+
20
+ **What:** `.dart` files are now parsed. Symbols cover classes, mixins,
21
+ enums, extensions, typedefs, top-level functions, methods,
22
+ getters/setters, and constructors (with parameter arity); imports and
23
+ re-exports surface their URI (`package:…`, `dart:…`, relative); calls and
24
+ type references (inheritance, field/parameter/return types, generic
25
+ arguments) are extracted. Dart's grammar differs structurally from the
26
+ other languages — function names follow the return type inside
27
+ `function_signature`, calls are a `selector` + `argument_part` chain
28
+ rather than a single call-expression node, and import URIs are nested
29
+ under `configurable_uri > uri` — so each needed dedicated handling.
30
+ Node-type names that collide with TypeScript (`function_signature`,
31
+ `declaration`, …) are gated on `lang == "dart"` so TS output is
32
+ unchanged.
33
+
34
+ **Reason:** Flutter/Dart codebases were a blind spot — every `.dart`
35
+ file was skipped at `lang_for`, so half of a mobile + backend stack had
36
+ no graph topology, leaving retrieval to dense vectors alone.
37
+
38
+ ### Added — Cross-language receiver-type inference (C#, PHP, Dart)
39
+
40
+ **What:** the `this.<field>.<method>()` narrowing that let the resolver
41
+ disambiguate a call against the methods of the field's declared type now
42
+ works beyond TypeScript. The class-scope stack is language-aware: C#
43
+ reads fields, properties, and C# 12 primary-constructor parameters and
44
+ resolves both `_repo.Get()` and `this.Bar.Save()`; PHP reads properties
45
+ and PHP 8 constructor promotion and resolves `$this->repo->m()`; Dart
46
+ reads typed fields and resolves `repo.m()` / `this.repo.m()`. A shared
47
+ `_bare_type_name` reduces qualified / generic / nullable types to the
48
+ bare identifier the resolver matches on, dropping primitives.
49
+
50
+ **Reason:** the resolver's receiver tier is language-agnostic — it
51
+ matches a bare type name against files defining that symbol — but the
52
+ extractor only ever emitted `receiver_type` for TS. On C#/PHP/Dart, a
53
+ method call like `byId` collapsed to a bare identifier that the resolver
54
+ could never narrow against the dozens of same-named methods elsewhere in
55
+ the codebase. Emitting the inferred receiver type fixes that with no
56
+ resolver changes.
57
+
58
+ ## [0.5.3] — 2026-06-04
59
+
60
+ Release theme: **git operations never block on credentials**. The
61
+ snapshot store talked to `origin` with plain `git fetch` / `git push`
62
+ and nothing to suppress interactive auth. On any HTTPS remote without
63
+ cached credentials that froze the MCP server at boot and re-prompted on
64
+ every `code-memory status` and watcher tick.
65
+
66
+ ### Fixed — Interactive git credential prompts froze the MCP server
67
+
68
+ **What:** every best-effort / read git call in `SnapshotStore` (`fetch`,
69
+ listing, the snapshot existence check) now runs with
70
+ `GIT_TERMINAL_PROMPT=0`, `GIT_SSH_COMMAND=ssh -oBatchMode=yes`, and an
71
+ empty `-c credential.helper=` so it fails fast instead of blocking. Only
72
+ the explicit publish path (`push` during `snapshot publish` / `gc`) opts
73
+ back into credentials via `allow_credentials=True`, so opted-in remotes
74
+ still authenticate.
75
+
76
+ **Reason:** `GIT_TERMINAL_PROMPT=0` alone was not enough — a configured
77
+ credential helper such as Git Credential Manager is a separate program
78
+ git still launches, and it pops its own dialog. The MCP bootstrap runs a
79
+ synchronous `sync_repo(trigger="mcp-boot")` with `fetch=True`; on an
80
+ auth-required remote that `git fetch` hung waiting for a password the
81
+ stdio server could never supply, so OpenCode reported the server as not
82
+ running. The watcher's per-quiet-period sync and `code-memory status`
83
+ hit the same wall. Resetting the helper list makes git return in ~0.1s
84
+ (no remote snapshots) instead of waiting on a human.
85
+
11
86
  ## [0.5.2] — 2026-05-30
12
87
 
13
88
  Release theme: **the watcher stops leaking**. A diagnosis of runaway RAM
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: flurryx-code-memory
3
- Version: 0.5.2
3
+ Version: 0.6.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
@@ -1772,6 +1772,7 @@ See `CHANGELOG.md` for the design rationale.
1772
1772
  - [x] `code-memory vacuum --before <sha>` / `--older-than` / `--all` (tombstone GC)
1773
1773
  - [x] MCP tools: `codememory_drift`, `codememory_at_sha`, `codememory_callers_at_sha`
1774
1774
  - [x] .NET ecosystem (C#, Razor, VB.NET, F#)
1775
+ - [x] Dart / Flutter (classes, mixins, enums, extensions, typedefs, imports/exports, calls, type refs)
1775
1776
  - [ ] More languages (Rust, Go, Java)
1776
1777
  - [ ] Cursor hook recipe
1777
1778
  - [ ] PyPI release (drops the `--from git+…` from the `uvx` install)
@@ -0,0 +1,117 @@
1
+ # @code-memory/vibe-plugin
2
+
3
+ Mistral Vibe plugin that wires the [`code-memory`](../..) backend into Vibe.
4
+ Same spirit as the [Claude Code](../claude-code/README.md),
5
+ [Cursor](../cursor/README.md), and [OpenCode](../opencode/README.md) plugins,
6
+ adapted to what Vibe actually exposes.
7
+
8
+ ## The honest mapping
9
+
10
+ Vibe is extensible through **Skills**, **MCP servers**, **custom agents**, and
11
+ **custom prompts** — but it has **no lifecycle-hook API**. The Claude Code and
12
+ Cursor plugins lean on hooks (`sessionStart`, `postToolUse`, `afterFileEdit`,
13
+ `stop`, `preCompact`, …) for per-turn automation: auto-reingest on write,
14
+ episode recording on stop, the retrieve-before-grep nudge. None of that can
15
+ fire from inside Vibe.
16
+
17
+ So this plugin delivers the same capability through the surfaces Vibe has:
18
+
19
+ | code-memory plugin piece | Vibe equivalent |
20
+ | ----------------------------------------------- | ---------------------------------------------------------- |
21
+ | MCP server (`codememory_*` tools) | `[[mcp_servers]]` block in `config.toml` |
22
+ | `/code-memory` slash command | `skills/code-memory/SKILL.md` (`user-invocable: true`) |
23
+ | Context rule (retrieve-before-grep steering) | The same skill's body — standing orientation guidance |
24
+ | `afterFileEdit` → auto-reingest hook | **OS autostart watcher** (`code-memory autostart install`) |
25
+ | `sessionStart` / `stop` / `preCompact` episodes | _no equivalent_ — drive `code-memory record` manually |
26
+
27
+ The OS watcher is harness-independent, so it covers the file-edit → reingest
28
+ loop that Vibe cannot hook. Episode recording on session events has no host
29
+ trigger; use `/code-memory` or the CLI to record manually when it matters.
30
+
31
+ ## What it installs
32
+
33
+ 1. **Skill** at `<vibe>/skills/code-memory/SKILL.md` — auto-discovered,
34
+ exposed as `/code-memory`, and read as orientation guidance that steers the
35
+ agent to the index first.
36
+ 2. **MCP server** — a managed `[[mcp_servers]]` block in `config.toml`
37
+ spawning `code-memory-mcp` via `uvx`.
38
+ 3. **OS autostart watcher** for the current repo, unless `--no-watch`.
39
+
40
+ ## Requirements
41
+
42
+ 1. **`uvx`** (from [uv](https://docs.astral.sh/uv/)) on PATH, to spawn the MCP
43
+ server. `pipx install uv` / `brew install uv` / `curl -LsSf https://astral.sh/uv/install.sh | sh`.
44
+ 2. **`code-memory` CLI** on PATH (for `/code-memory` and the watcher):
45
+ ```bash
46
+ pipx install git+https://github.com/fmflurry/code-memory
47
+ # or
48
+ uv tool install git+https://github.com/fmflurry/code-memory
49
+ ```
50
+ 3. **Running infra**: FalkorDB + Qdrant + Ollama with `bge-m3`. See the main
51
+ [README](../../README.md#installation).
52
+ 4. The repo must have been ingested at least once:
53
+ ```bash
54
+ code-memory ingest /path/to/repo
55
+ ```
56
+
57
+ ## Install
58
+
59
+ ```bash
60
+ # user scope (default) — writes ${VIBE_HOME:-~/.vibe}/config.toml + skills/
61
+ ./plugins/vibe/install.sh
62
+
63
+ # project scope — writes ./.vibe/config.toml + skills/
64
+ ./plugins/vibe/install.sh --scope project
65
+
66
+ # skip MCP server registration
67
+ ./plugins/vibe/install.sh --no-mcp
68
+
69
+ # skip the OS autostart watcher
70
+ ./plugins/vibe/install.sh --no-watch
71
+
72
+ # remove the skill, our MCP block, and the watcher
73
+ ./plugins/vibe/install.sh --uninstall
74
+ ```
75
+
76
+ The installer:
77
+ - Copies the skill into `<vibe>/skills/code-memory/`.
78
+ - Appends a managed `code-memory` `[[mcp_servers]]` block to `config.toml`
79
+ between sentinel comments — foreign config is preserved, re-running replaces
80
+ only our block.
81
+ - Installs the OS autostart watcher for the current repo.
82
+
83
+ **Restart Vibe** after installing so it re-scans skills + MCP servers.
84
+
85
+ ## The MCP block
86
+
87
+ ```toml
88
+ # >>> code-memory (managed by plugins/vibe/install.sh) >>>
89
+ [[mcp_servers]]
90
+ name = "code-memory"
91
+ transport = "stdio"
92
+ command = "uvx"
93
+ args = ["--from", "git+https://github.com/fmflurry/code-memory", "code-memory-mcp"]
94
+ # <<< code-memory <<<
95
+ ```
96
+
97
+ The server auto-detects the project slug from its working directory
98
+ (`detect_project_slug()`), so no environment variable is required. Each
99
+ `codememory_*` tool still takes an explicit `project` argument — the repo-root
100
+ basename, never `auto`/`default`.
101
+
102
+ ## Verify locally
103
+
104
+ ```bash
105
+ # Skill is discovered + slash command exists
106
+ ls "${VIBE_HOME:-$HOME/.vibe}/skills/code-memory/SKILL.md"
107
+
108
+ # MCP block is present
109
+ grep -A6 'code-memory (managed' "${VIBE_HOME:-$HOME/.vibe}/config.toml"
110
+
111
+ # Watcher is registered for this repo
112
+ code-memory autostart status .
113
+ ```
114
+
115
+ ## License
116
+
117
+ MIT — see [LICENSE](../../LICENSE).
@@ -0,0 +1,184 @@
1
+ #!/usr/bin/env bash
2
+ # Install the code-memory Mistral Vibe plugin.
3
+ #
4
+ # Mistral Vibe has no lifecycle-hook API (unlike Claude Code / Cursor), so this
5
+ # plugin wires code-memory in through the three surfaces Vibe *does* expose:
6
+ #
7
+ # 1. A Skill (skills/code-memory/SKILL.md) — auto-discovered, exposed as the
8
+ # `/code-memory` slash command, and standing orientation guidance that
9
+ # steers the agent toward the index before grep/read/shell.
10
+ # 2. The code-memory MCP server, registered as a managed `[[mcp_servers]]`
11
+ # block in config.toml (exposes the `codememory_*` tools).
12
+ # 3. The OS-level autostart watcher (`code-memory autostart install`) — the
13
+ # background auto-reingest that replaces the per-turn hooks Vibe lacks.
14
+ #
15
+ # Vibe reads config + skills from:
16
+ # - user scope: ${VIBE_HOME:-~/.vibe}/{config.toml,skills/}
17
+ # - project scope: <cwd>/.vibe/{config.toml,skills/}
18
+ #
19
+ # All operations are idempotent. The MCP entry lives between sentinel comments
20
+ # so re-running replaces only our block and leaves foreign config untouched.
21
+ #
22
+ # Flags:
23
+ # --scope X user (default) | project
24
+ # --no-mcp skip MCP server registration
25
+ # --no-watch skip installing the OS autostart watcher
26
+ # --uninstall remove the skill, our MCP block, and the watcher
27
+
28
+ set -euo pipefail
29
+
30
+ REPO_ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
31
+ PLUGIN_DIR="$REPO_ROOT/plugins/vibe"
32
+ SKILL_SRC="$PLUGIN_DIR/skills/code-memory"
33
+
34
+ [[ -f "$SKILL_SRC/SKILL.md" ]] || {
35
+ echo "✗ Missing skills/code-memory/SKILL.md — repo layout broken." >&2
36
+ exit 1
37
+ }
38
+
39
+ SCOPE="user"
40
+ SKIP_MCP=0
41
+ SKIP_WATCH=0
42
+ UNINSTALL=0
43
+
44
+ while [[ $# -gt 0 ]]; do
45
+ case "$1" in
46
+ --scope) SCOPE="$2"; shift 2 ;;
47
+ --no-mcp) SKIP_MCP=1; shift ;;
48
+ --no-watch) SKIP_WATCH=1; shift ;;
49
+ --uninstall) UNINSTALL=1; shift ;;
50
+ -h|--help)
51
+ cat <<EOF
52
+ Usage: $0 [--scope user|project] [--no-mcp] [--no-watch] [--uninstall]
53
+
54
+ --scope X user (default — writes \${VIBE_HOME:-~/.vibe}/) | project (./.vibe/)
55
+ --no-mcp skip MCP server registration in config.toml
56
+ --no-watch skip installing the OS autostart watcher
57
+ --uninstall remove the skill, our config.toml MCP block, and the watcher
58
+
59
+ The installer copies the code-memory skill, merges a managed code-memory MCP
60
+ block into config.toml (preserving foreign config), and installs the OS
61
+ autostart watcher so file edits are re-ingested in the background — Vibe has
62
+ no hooks to do that per-turn.
63
+ EOF
64
+ exit 0
65
+ ;;
66
+ *)
67
+ echo "Unknown flag: $1" >&2
68
+ exit 2
69
+ ;;
70
+ esac
71
+ done
72
+
73
+ case "$SCOPE" in
74
+ user) TARGET_DIR="${VIBE_HOME:-$HOME/.vibe}" ;;
75
+ project) TARGET_DIR="$(pwd)/.vibe" ;;
76
+ *)
77
+ echo "✗ --scope must be user or project (got: $SCOPE)" >&2
78
+ exit 2
79
+ ;;
80
+ esac
81
+
82
+ CONFIG_FILE="$TARGET_DIR/config.toml"
83
+ SKILL_DST="$TARGET_DIR/skills/code-memory"
84
+ BEGIN_MARK="# >>> code-memory (managed by plugins/vibe/install.sh) >>>"
85
+ END_MARK="# <<< code-memory <<<"
86
+
87
+ # Strip our managed block from config.toml (in place, leaving a trailing
88
+ # newline). No-op if the file or block is absent.
89
+ strip_mcp_block() {
90
+ [[ -f "$CONFIG_FILE" ]] || return 0
91
+ local tmp
92
+ tmp="$(mktemp)"
93
+ awk -v b="$BEGIN_MARK" -v e="$END_MARK" '
94
+ $0 == b { skip = 1; next }
95
+ $0 == e { skip = 0; next }
96
+ !skip { print }
97
+ ' "$CONFIG_FILE" > "$tmp"
98
+ mv "$tmp" "$CONFIG_FILE"
99
+ }
100
+
101
+ # --------------------------------------------------------------- uninstall
102
+ if [[ "$UNINSTALL" -eq 1 ]]; then
103
+ strip_mcp_block
104
+ [[ -f "$CONFIG_FILE" ]] && echo "✓ removed code-memory MCP block from $CONFIG_FILE"
105
+ rm -rf "$SKILL_DST"
106
+ echo "✓ removed $SKILL_DST"
107
+ if [[ "$SKIP_WATCH" -eq 0 ]] && command -v code-memory >/dev/null 2>&1; then
108
+ code-memory autostart uninstall "$(pwd)" >/dev/null 2>&1 \
109
+ && echo "✓ removed OS autostart watcher for $(pwd)" \
110
+ || echo "↪ no autostart watcher to remove (or removal failed)"
111
+ fi
112
+ echo "Done. Restart Vibe to pick up the change."
113
+ exit 0
114
+ fi
115
+
116
+ # --------------------------------------------------------------- install
117
+ echo "→ Target: $TARGET_DIR (scope=$SCOPE)"
118
+ mkdir -p "$TARGET_DIR/skills"
119
+
120
+ # 1) Install the skill
121
+ rm -rf "$SKILL_DST"
122
+ mkdir -p "$SKILL_DST"
123
+ cp "$SKILL_SRC/SKILL.md" "$SKILL_DST/SKILL.md"
124
+ echo "✓ wrote $SKILL_DST/SKILL.md"
125
+
126
+ # 2) MCP server registration (managed block)
127
+ if [[ "$SKIP_MCP" -eq 0 ]]; then
128
+ if ! command -v uvx >/dev/null 2>&1; then
129
+ cat >&2 <<EOF
130
+ ⚠ uvx not on PATH. The MCP block will still be written but Vibe will fail to
131
+ spawn code-memory-mcp until you install uv:
132
+ pipx install uv | brew install uv
133
+ pip3 install --user uv | curl -LsSf https://astral.sh/uv/install.sh | sh
134
+ EOF
135
+ fi
136
+ mkdir -p "$TARGET_DIR"
137
+ strip_mcp_block
138
+ # Ensure a clean separator before appending.
139
+ if [[ -s "$CONFIG_FILE" ]]; then printf '\n' >> "$CONFIG_FILE"; fi
140
+ cat >> "$CONFIG_FILE" <<EOF
141
+ $BEGIN_MARK
142
+ [[mcp_servers]]
143
+ name = "code-memory"
144
+ transport = "stdio"
145
+ command = "uvx"
146
+ args = ["--from", "git+https://github.com/fmflurry/code-memory", "code-memory-mcp"]
147
+ $END_MARK
148
+ EOF
149
+ echo "✓ wrote $CONFIG_FILE (code-memory MCP block)"
150
+ else
151
+ echo "↪ skipped MCP registration (--no-mcp)"
152
+ fi
153
+
154
+ # 3) OS autostart watcher — the per-turn-hook replacement
155
+ if [[ "$SKIP_WATCH" -eq 0 ]]; then
156
+ if command -v code-memory >/dev/null 2>&1; then
157
+ if code-memory autostart install "$(pwd)" >/dev/null 2>&1; then
158
+ echo "✓ installed OS autostart watcher for $(pwd)"
159
+ else
160
+ echo "⚠ could not install autostart watcher (run: code-memory autostart install .)"
161
+ fi
162
+ else
163
+ echo "↪ skipped watcher — code-memory CLI not on PATH"
164
+ fi
165
+ else
166
+ echo "↪ skipped autostart watcher (--no-watch)"
167
+ fi
168
+
169
+ # 4) CLI presence check
170
+ echo
171
+ if command -v code-memory >/dev/null 2>&1; then
172
+ echo "✓ \`code-memory\` CLI on PATH: $(command -v code-memory)"
173
+ else
174
+ cat <<EOF
175
+ ⚠ \`code-memory\` CLI is NOT on PATH. The skill + MCP server still load, but
176
+ the /code-memory command and the watcher need it:
177
+
178
+ pipx install git+https://github.com/fmflurry/code-memory
179
+ uv tool install git+https://github.com/fmflurry/code-memory
180
+ EOF
181
+ fi
182
+
183
+ echo
184
+ echo "Done. Restart Vibe so it picks up the new skill + MCP server."
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: code-memory
3
+ description: Orient on the codebase via the code-memory MCP index before grep/read/shell, and drive the backend manually (retrieve / record / reingest / ingest).
4
+ user-invocable: true
5
+ ---
6
+
7
+ # code-memory: retrieve before grep
8
+
9
+ For any question that maps to "where is X / how does Y work / who calls Z /
10
+ where do docs live / what depends on this", call the `code-memory` MCP tools
11
+ **before** grep, glob, read, or shell. The index is faster, ranked, and aware
12
+ of past episodes + durable user claims.
13
+
14
+ Mistral Vibe has no lifecycle hooks, so the per-turn automation that the Claude
15
+ Code / Cursor plugins get for free does not fire here. This skill is the
16
+ standing instruction that replaces it: you drive the index explicitly.
17
+
18
+ ## Pick the right tool
19
+
20
+ - `codememory_retrieve` — semantic + episodic recall. Default first call for
21
+ any natural-language code question.
22
+ - `codememory_definitions(symbol)` — exact file + line for a name.
23
+ - `codememory_callers(symbol)` / `codememory_callees(symbol)` — call graph
24
+ (rename impact, dependency mapping).
25
+ - `codememory_importers(target)` / `codememory_dependencies(file)` — module
26
+ import graph.
27
+ - `codememory_at_sha`, `codememory_callers_at_sha`, `codememory_drift` —
28
+ temporal queries (what existed at a past commit, what's stale).
29
+ - `codememory_assert_claim` — record durable user assertions (preferences,
30
+ decisions, rejections, ownership, location).
31
+
32
+ Every tool takes a required `project` argument: the repo slug, which is the
33
+ basename of the repo root directory (e.g. `code-memory` for
34
+ `/Users/you/Workspace/code-memory`). Do not pass `auto` or `default` — they are
35
+ rejected.
36
+
37
+ ## Workflow
38
+
39
+ 1. Read the question. If it's about repo / code / docs structure, call the
40
+ matching code-memory tool first.
41
+ 2. Use filesystem tools (read / grep / shell) only to verify or read specific
42
+ files the index pointed to.
43
+ 3. After completing a non-trivial task, call `codememory_record(prompt, plan,
44
+ patch, verdict)` so the next session can recall what worked.
45
+ 4. When the user states a preference, decision, or rejection, call
46
+ `codememory_assert_claim` to make it durable.
47
+
48
+ Default to one targeted MCP call over a wide grep. Read source files only after
49
+ the graph tells you exactly which lines to open.
50
+
51
+ ## Driving the backend manually
52
+
53
+ The CLI covers the paths Vibe cannot hook. Run these via shell when needed:
54
+
55
+ - Force a retrieval: `code-memory retrieve "rotate refresh tokens" --json`
56
+ - Record an episode: `code-memory record --prompt "..." --verdict success`
57
+ - Refresh a stale index after an out-of-band edit: `code-memory ingest .`
58
+ - Re-point cross-file CALLS edges: `code-memory resolve`
59
+
60
+ If the OS watcher is installed (`code-memory autostart status`), file edits are
61
+ re-ingested automatically in the background and you rarely need step 3's manual
62
+ `ingest`. If it is not running, re-ingest after a batch of writes.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "flurryx-code-memory"
7
- version = "0.5.2"
7
+ version = "0.6.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 = [
@@ -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 {
@@ -267,6 +283,7 @@ Step "Agent harness plugins"
267
283
  $installOpencode = $false
268
284
  $installClaudecode = $false
269
285
  $installCursor = $false
286
+ $installVibe = $false
270
287
 
271
288
  function Resolve-PluginSelection([string]$raw) {
272
289
  if ([string]::IsNullOrWhiteSpace($raw)) { return }
@@ -275,18 +292,22 @@ function Resolve-PluginSelection([string]$raw) {
275
292
  $script:installOpencode = $true
276
293
  $script:installClaudecode = $true
277
294
  $script:installCursor = $true
295
+ $script:installVibe = $true
278
296
  return
279
297
  }
280
298
  foreach ($p in $raw.Split(',')) {
281
299
  $key = $p.Trim().ToLower()
282
300
  switch ($key) {
283
- 'opencode' { $script:installOpencode = $true }
284
- 'claudecode' { $script:installClaudecode = $true }
285
- 'claude' { $script:installClaudecode = $true }
286
- 'claude-code' { $script:installClaudecode = $true }
287
- 'cursor' { $script:installCursor = $true }
288
- '' { }
289
- default { Warn "unknown plugin '$p' (expected: opencode, claudecode, cursor, all, none)" }
301
+ 'opencode' { $script:installOpencode = $true }
302
+ 'claudecode' { $script:installClaudecode = $true }
303
+ 'claude' { $script:installClaudecode = $true }
304
+ 'claude-code' { $script:installClaudecode = $true }
305
+ 'cursor' { $script:installCursor = $true }
306
+ 'vibe' { $script:installVibe = $true }
307
+ 'mistral' { $script:installVibe = $true }
308
+ 'mistral-vibe' { $script:installVibe = $true }
309
+ '' { }
310
+ default { Warn "unknown plugin '$p' (expected: opencode, claudecode, cursor, vibe, all, none)" }
290
311
  }
291
312
  }
292
313
  }
@@ -300,8 +321,9 @@ if (-not [string]::IsNullOrWhiteSpace($Plugins)) {
300
321
  if (Prompt-YesNo "Install OpenCode plugin?" $true) { $installOpencode = $true }
301
322
  if (Prompt-YesNo "Install Claude Code plugin?" $true) { $installClaudecode = $true }
302
323
  if (Prompt-YesNo "Install Cursor plugin?" $true) { $installCursor = $true }
303
- if (($installOpencode -or $installClaudecode -or $installCursor) -and $PluginsScope -eq 'global') {
304
- if (Prompt-YesNo "Install project-local (./.opencode, ./.claude, ./.cursor) instead of global?" $false) {
324
+ if (Prompt-YesNo "Install Mistral Vibe plugin?" $true) { $installVibe = $true }
325
+ if (($installOpencode -or $installClaudecode -or $installCursor -or $installVibe) -and $PluginsScope -eq 'global') {
326
+ if (Prompt-YesNo "Install project-local (./.opencode, ./.claude, ./.cursor, ./.vibe) instead of global?" $false) {
305
327
  $PluginsScope = 'project'
306
328
  }
307
329
  }
@@ -349,8 +371,11 @@ if ($installClaudecode) {
349
371
  if ($installCursor) {
350
372
  Invoke-PluginInstaller 'plugins/cursor/install.sh' 'Cursor' 'scope'
351
373
  }
352
- if (-not $installOpencode -and -not $installClaudecode -and -not $installCursor) {
353
- Warn "no harness plugin installed; re-run with -Plugins all (or =opencode/=claudecode/=cursor) later"
374
+ if ($installVibe) {
375
+ Invoke-PluginInstaller 'plugins/vibe/install.sh' 'Mistral Vibe' 'scope'
376
+ }
377
+ if (-not $installOpencode -and -not $installClaudecode -and -not $installCursor -and -not $installVibe) {
378
+ Warn "no harness plugin installed; re-run with -Plugins all (or =opencode/=claudecode/=cursor/=vibe) later"
354
379
  }
355
380
 
356
381
  # ---------- done ----------
@@ -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"
@@ -326,10 +340,11 @@ step "Agent harness plugins"
326
340
  # PLUGINS_ARG="" → interactive (only if stdin is a TTY)
327
341
  # PLUGINS_ARG="none" → skip
328
342
  # PLUGINS_ARG="all" → both
329
- # PLUGINS_ARG="opencode,claudecode,cursor" → comma-separated whitelist
343
+ # PLUGINS_ARG="opencode,claudecode,cursor,vibe" → comma-separated whitelist
330
344
  INSTALL_OPENCODE=0
331
345
  INSTALL_CLAUDECODE=0
332
346
  INSTALL_CURSOR=0
347
+ INSTALL_VIBE=0
333
348
 
334
349
  resolve_plugin_selection() {
335
350
  local raw="$1"
@@ -338,6 +353,7 @@ resolve_plugin_selection() {
338
353
  INSTALL_OPENCODE=1
339
354
  INSTALL_CLAUDECODE=1
340
355
  INSTALL_CURSOR=1
356
+ INSTALL_VIBE=1
341
357
  return 0
342
358
  fi
343
359
  IFS=',' read -r -a parts <<< "$raw"
@@ -346,8 +362,9 @@ resolve_plugin_selection() {
346
362
  opencode) INSTALL_OPENCODE=1 ;;
347
363
  claudecode|claude|claude-code) INSTALL_CLAUDECODE=1 ;;
348
364
  cursor) INSTALL_CURSOR=1 ;;
365
+ vibe|mistral|mistral-vibe) INSTALL_VIBE=1 ;;
349
366
  "" ) ;;
350
- *) warn "unknown plugin '$p' (expected: opencode, claudecode, cursor, all, none)" ;;
367
+ *) warn "unknown plugin '$p' (expected: opencode, claudecode, cursor, vibe, all, none)" ;;
351
368
  esac
352
369
  done
353
370
  }
@@ -361,8 +378,9 @@ elif [ -t 0 ] && [ -t 1 ]; then
361
378
  if prompt_yes_no "Install OpenCode plugin?" "y"; then INSTALL_OPENCODE=1; fi
362
379
  if prompt_yes_no "Install Claude Code plugin?" "y"; then INSTALL_CLAUDECODE=1; fi
363
380
  if prompt_yes_no "Install Cursor plugin?" "y"; then INSTALL_CURSOR=1; fi
364
- if [ "$INSTALL_OPENCODE" -eq 1 ] || [ "$INSTALL_CLAUDECODE" -eq 1 ] || [ "$INSTALL_CURSOR" -eq 1 ]; then
365
- if prompt_yes_no "Install project-local (./.opencode, ./.claude, ./.cursor) instead of global?" "n"; then
381
+ if prompt_yes_no "Install Mistral Vibe plugin?" "y"; then INSTALL_VIBE=1; fi
382
+ if [ "$INSTALL_OPENCODE" -eq 1 ] || [ "$INSTALL_CLAUDECODE" -eq 1 ] || [ "$INSTALL_CURSOR" -eq 1 ] || [ "$INSTALL_VIBE" -eq 1 ]; then
383
+ if prompt_yes_no "Install project-local (./.opencode, ./.claude, ./.cursor, ./.vibe) instead of global?" "n"; then
366
384
  PLUGINS_SCOPE="project"
367
385
  fi
368
386
  fi
@@ -411,8 +429,22 @@ if [ "$INSTALL_CURSOR" -eq 1 ]; then
411
429
  fi
412
430
  fi
413
431
 
414
- if [ "$INSTALL_OPENCODE" -eq 0 ] && [ "$INSTALL_CLAUDECODE" -eq 0 ] && [ "$INSTALL_CURSOR" -eq 0 ]; then
415
- warn "no harness plugin installed; re-run with --plugins=all (or =opencode/=claudecode/=cursor) later"
432
+ if [ "$INSTALL_VIBE" -eq 1 ]; then
433
+ if [ -x "$PROJECT_ROOT/plugins/vibe/install.sh" ]; then
434
+ # The vibe installer uses `--scope user|project`, like cursor.
435
+ vibe_flags=""
436
+ [ "$PLUGINS_SCOPE" = "project" ] && vibe_flags="$vibe_flags --scope project"
437
+ [ "$SKIP_MCP" -eq 1 ] && vibe_flags="$vibe_flags --no-mcp"
438
+ # shellcheck disable=SC2086 # intentional word-splitting on flag string
439
+ "$PROJECT_ROOT/plugins/vibe/install.sh" $vibe_flags
440
+ ok "Mistral Vibe plugin installed ($PLUGINS_SCOPE)"
441
+ else
442
+ warn "plugins/vibe/install.sh not executable; skipping"
443
+ fi
444
+ fi
445
+
446
+ if [ "$INSTALL_OPENCODE" -eq 0 ] && [ "$INSTALL_CLAUDECODE" -eq 0 ] && [ "$INSTALL_CURSOR" -eq 0 ] && [ "$INSTALL_VIBE" -eq 0 ]; then
447
+ warn "no harness plugin installed; re-run with --plugins=all (or =opencode/=claudecode/=cursor/=vibe) later"
416
448
  fi
417
449
 
418
450
  # ---------- done ----------