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.
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/CHANGELOG.md +75 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/PKG-INFO +1 -1
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/README.md +1 -0
- flurryx_code_memory-0.6.1/plugins/vibe/README.md +117 -0
- flurryx_code_memory-0.6.1/plugins/vibe/install.sh +184 -0
- flurryx_code_memory-0.6.1/plugins/vibe/skills/code-memory/SKILL.md +62 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/pyproject.toml +1 -1
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/scripts/install.ps1 +39 -14
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/scripts/install.sh +40 -8
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/treesitter.py +538 -11
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/store.py +47 -2
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/updater.py +85 -12
- flurryx_code_memory-0.6.1/tests/test_extractor_dart.py +151 -0
- flurryx_code_memory-0.6.1/tests/test_extractor_receiver_type.py +192 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/uv.lock +1 -1
- flurryx_code_memory-0.5.2/tests/test_extractor_receiver_type.py +0 -98
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/.claude-plugin/marketplace.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/.env.example +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/.gitignore +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/docker/docker-compose.yml +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/docs/BENCHMARK.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/docs/BENCHMARK_VS_BASELINE.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/docs/BENCHMARK_VS_BASELINE.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/docs/architecture.png +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/docs/benchmark-raw.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/docs/hero.png +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/install.ps1 +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/install.sh +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/README.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/commands/code-memory.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/hooks/hooks.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/install.sh +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/lib/claim-intent.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/lib/claim-intent.test.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/lib/io.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/lib/memory.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/lib/state.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/on-post-tool.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/on-pre-tool.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/on-retrieve-seen.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/on-session-start.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/on-stop.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/on-user-prompt.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/scripts/resolver-debounce.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/claude-code/skills/code-memory/SKILL.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/README.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/hooks/hooks.json.template +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/install.sh +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/rules/code-memory.mdc +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/lib/claim-intent.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/lib/claim-intent.test.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/lib/io.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/lib/memory.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/lib/state.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-after-file-edit.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-before-mcp-execution.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-before-submit-prompt.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-post-tool-use.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-pre-compact.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-pre-tool-use.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-session-end.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-session-start.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/on-stop.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/cursor/scripts/resolver-debounce.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/README.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/install.sh +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/package-lock.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/package.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/scripts/add-mcp.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/scripts/install.mjs +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/scripts/uninstall.mjs +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/skills/code-memory/SKILL.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/src/code-memory-lib/claim-intent.test.mts +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/src/code-memory-lib/claim-intent.ts +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/src/code-memory-lib/memory-client.ts +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/src/code-memory.ts +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/plugins/opencode/tsconfig.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/scripts/benchmark.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/scripts/benchmark_queries.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/scripts/benchmark_vs_baseline.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/scripts/benchmark_vs_grep.sh +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/scripts/ingest.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/claims/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/claims/extractor.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/claims/indexer.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/claims/resolver.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/claims/store.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/cli.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/config.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/embed/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/embed/cache.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/embed/m3.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/embed/ollama.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/embed/tei.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/episodic/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/episodic/sqlite_store.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/csproj.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/dll.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/gitignore.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/nuget.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/sanity.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/extractor/sln.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/graph/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/graph/falkor_store.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/mcp_server.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/metrics.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/orchestrator/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/orchestrator/git_delta.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/orchestrator/ingest_state.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/orchestrator/pipeline.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/orchestrator/reset.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/orchestrator/resolver.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/orchestrator/retrieve.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/resilience.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/autostart/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/autostart/base.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/autostart/launchd.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/autostart/schtasks.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/autostart/systemd.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/hooks.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/safety.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/snapshot.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/sync.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/sync/watcher.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/vector/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/src/code_memory/vector/qdrant_store.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_autostart_adapters.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_chunk_text.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_claim_extractor.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_claim_indexer.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_claim_resolver.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_claim_store.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_config_embed_dim.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_config_sentinel.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_csproj.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_dll_members.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_dll_parser.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_embed_backend.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_embed_cache.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_embed_m3.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_embed_tei.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_episode_dedup.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_episode_head_sha.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_csharp.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_filters.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_php.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_python_imports.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_references.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_sanity.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_ts_abstract.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_ts_inject.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_extractor_utf8.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_file_containment.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_git_delta.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_graph_queries.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_graph_temporal.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_graph_vacuum_at_sha.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_hooks_installer.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_ingest_state.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_mcp_assert_claim.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_mcp_server_descriptions.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_mcp_shutdown.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_mcp_strict_project.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_metrics.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_nuget_resolver.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_overload_resolution.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_partial_class.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_pipeline_references.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_pipeline_temporal_wiring.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_qdrant_legacy_guard.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_razor_inject.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_resilience.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_resolver.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_resolver_assembly.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_retrieve_claims_surfacing.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_retrieve_rerank.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_sln.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_smoke.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_snapshot_e2e.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_snapshot_format.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_snapshot_store.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_sync_decision_tree.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_watch_safety.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_watcher_debouncer.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.1}/tests/test_watcher_exclude.py +0 -0
- {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
|
|
@@ -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.
|
|
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
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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'
|
|
284
|
-
'claudecode'
|
|
285
|
-
'claude'
|
|
286
|
-
'claude-code'
|
|
287
|
-
'cursor'
|
|
288
|
-
''
|
|
289
|
-
|
|
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 (
|
|
304
|
-
|
|
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 (
|
|
353
|
-
|
|
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
|
-
|
|
224
|
-
|
|
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
|
|
365
|
-
|
|
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 [ "$
|
|
415
|
-
|
|
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 ----------
|