flurryx-code-memory 0.5.2__tar.gz → 0.6.0__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.0}/CHANGELOG.md +75 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/PKG-INFO +1 -1
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/README.md +1 -0
- flurryx_code_memory-0.6.0/plugins/vibe/README.md +117 -0
- flurryx_code_memory-0.6.0/plugins/vibe/install.sh +184 -0
- flurryx_code_memory-0.6.0/plugins/vibe/skills/code-memory/SKILL.md +62 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/pyproject.toml +1 -1
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/scripts/install.ps1 +20 -11
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/scripts/install.sh +24 -6
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/extractor/treesitter.py +538 -11
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/sync/store.py +47 -2
- flurryx_code_memory-0.6.0/tests/test_extractor_dart.py +151 -0
- flurryx_code_memory-0.6.0/tests/test_extractor_receiver_type.py +192 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/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.0}/.claude-plugin/marketplace.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/.env.example +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/.gitignore +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/docker/docker-compose.yml +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/docs/BENCHMARK.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/docs/BENCHMARK_VS_BASELINE.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/docs/BENCHMARK_VS_BASELINE.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/docs/architecture.png +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/docs/benchmark-raw.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/docs/hero.png +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/install.ps1 +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/install.sh +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/.claude-plugin/plugin.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/README.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/commands/code-memory.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/hooks/hooks.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/install.sh +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/scripts/lib/claim-intent.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/scripts/lib/claim-intent.test.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/scripts/lib/io.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/scripts/lib/memory.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/scripts/lib/state.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/scripts/on-post-tool.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/scripts/on-pre-tool.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/scripts/on-retrieve-seen.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/scripts/on-session-start.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/scripts/on-stop.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/scripts/on-user-prompt.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/scripts/resolver-debounce.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/claude-code/skills/code-memory/SKILL.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/README.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/hooks/hooks.json.template +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/install.sh +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/rules/code-memory.mdc +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/scripts/lib/claim-intent.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/scripts/lib/claim-intent.test.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/scripts/lib/io.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/scripts/lib/memory.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/scripts/lib/state.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/scripts/on-after-file-edit.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/scripts/on-before-mcp-execution.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/scripts/on-before-submit-prompt.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/scripts/on-post-tool-use.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/scripts/on-pre-compact.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/scripts/on-pre-tool-use.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/scripts/on-session-end.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/scripts/on-session-start.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/scripts/on-stop.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/cursor/scripts/resolver-debounce.js +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/opencode/README.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/opencode/install.sh +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/opencode/package-lock.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/opencode/package.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/opencode/scripts/add-mcp.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/opencode/scripts/install.mjs +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/opencode/scripts/uninstall.mjs +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/opencode/skills/code-memory/SKILL.md +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/opencode/src/code-memory-lib/claim-intent.test.mts +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/opencode/src/code-memory-lib/claim-intent.ts +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/opencode/src/code-memory-lib/memory-client.ts +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/opencode/src/code-memory.ts +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/plugins/opencode/tsconfig.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/scripts/benchmark.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/scripts/benchmark_queries.json +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/scripts/benchmark_vs_baseline.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/scripts/benchmark_vs_grep.sh +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/scripts/ingest.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/claims/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/claims/extractor.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/claims/indexer.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/claims/resolver.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/claims/store.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/cli.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/config.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/embed/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/embed/cache.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/embed/m3.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/embed/ollama.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/embed/tei.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/episodic/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/episodic/sqlite_store.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/extractor/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/extractor/csproj.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/extractor/dll.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/extractor/gitignore.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/extractor/nuget.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/extractor/sanity.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/extractor/sln.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/graph/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/graph/falkor_store.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/mcp_server.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/metrics.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/orchestrator/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/orchestrator/git_delta.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/orchestrator/ingest_state.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/orchestrator/pipeline.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/orchestrator/reset.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/orchestrator/resolver.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/orchestrator/retrieve.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/resilience.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/sync/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/sync/autostart/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/sync/autostart/base.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/sync/autostart/launchd.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/sync/autostart/schtasks.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/sync/autostart/systemd.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/sync/hooks.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/sync/safety.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/sync/snapshot.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/sync/sync.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/sync/watcher.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/updater.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/vector/__init__.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/src/code_memory/vector/qdrant_store.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_autostart_adapters.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_chunk_text.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_claim_extractor.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_claim_indexer.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_claim_resolver.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_claim_store.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_config_embed_dim.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_config_sentinel.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_csproj.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_dll_members.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_dll_parser.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_embed_backend.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_embed_cache.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_embed_m3.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_embed_tei.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_episode_dedup.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_episode_head_sha.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_extractor_csharp.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_extractor_filters.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_extractor_php.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_extractor_python_imports.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_extractor_references.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_extractor_sanity.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_extractor_ts_abstract.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_extractor_ts_inject.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_extractor_utf8.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_file_containment.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_git_delta.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_graph_queries.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_graph_temporal.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_graph_vacuum_at_sha.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_hooks_installer.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_ingest_state.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_mcp_assert_claim.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_mcp_server_descriptions.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_mcp_shutdown.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_mcp_strict_project.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_metrics.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_nuget_resolver.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_overload_resolution.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_partial_class.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_pipeline_references.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_pipeline_temporal_wiring.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_qdrant_legacy_guard.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_razor_inject.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_resilience.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_resolver.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_resolver_assembly.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_retrieve_claims_surfacing.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_retrieve_rerank.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_sln.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_smoke.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_snapshot_e2e.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_snapshot_format.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_snapshot_store.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_sync_decision_tree.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_watch_safety.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_watcher_debouncer.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/tests/test_watcher_exclude.py +0 -0
- {flurryx_code_memory-0.5.2 → flurryx_code_memory-0.6.0}/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.0"
|
|
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 = [
|
|
@@ -267,6 +267,7 @@ Step "Agent harness plugins"
|
|
|
267
267
|
$installOpencode = $false
|
|
268
268
|
$installClaudecode = $false
|
|
269
269
|
$installCursor = $false
|
|
270
|
+
$installVibe = $false
|
|
270
271
|
|
|
271
272
|
function Resolve-PluginSelection([string]$raw) {
|
|
272
273
|
if ([string]::IsNullOrWhiteSpace($raw)) { return }
|
|
@@ -275,18 +276,22 @@ function Resolve-PluginSelection([string]$raw) {
|
|
|
275
276
|
$script:installOpencode = $true
|
|
276
277
|
$script:installClaudecode = $true
|
|
277
278
|
$script:installCursor = $true
|
|
279
|
+
$script:installVibe = $true
|
|
278
280
|
return
|
|
279
281
|
}
|
|
280
282
|
foreach ($p in $raw.Split(',')) {
|
|
281
283
|
$key = $p.Trim().ToLower()
|
|
282
284
|
switch ($key) {
|
|
283
|
-
'opencode'
|
|
284
|
-
'claudecode'
|
|
285
|
-
'claude'
|
|
286
|
-
'claude-code'
|
|
287
|
-
'cursor'
|
|
288
|
-
''
|
|
289
|
-
|
|
285
|
+
'opencode' { $script:installOpencode = $true }
|
|
286
|
+
'claudecode' { $script:installClaudecode = $true }
|
|
287
|
+
'claude' { $script:installClaudecode = $true }
|
|
288
|
+
'claude-code' { $script:installClaudecode = $true }
|
|
289
|
+
'cursor' { $script:installCursor = $true }
|
|
290
|
+
'vibe' { $script:installVibe = $true }
|
|
291
|
+
'mistral' { $script:installVibe = $true }
|
|
292
|
+
'mistral-vibe' { $script:installVibe = $true }
|
|
293
|
+
'' { }
|
|
294
|
+
default { Warn "unknown plugin '$p' (expected: opencode, claudecode, cursor, vibe, all, none)" }
|
|
290
295
|
}
|
|
291
296
|
}
|
|
292
297
|
}
|
|
@@ -300,8 +305,9 @@ if (-not [string]::IsNullOrWhiteSpace($Plugins)) {
|
|
|
300
305
|
if (Prompt-YesNo "Install OpenCode plugin?" $true) { $installOpencode = $true }
|
|
301
306
|
if (Prompt-YesNo "Install Claude Code plugin?" $true) { $installClaudecode = $true }
|
|
302
307
|
if (Prompt-YesNo "Install Cursor plugin?" $true) { $installCursor = $true }
|
|
303
|
-
if (
|
|
304
|
-
|
|
308
|
+
if (Prompt-YesNo "Install Mistral Vibe plugin?" $true) { $installVibe = $true }
|
|
309
|
+
if (($installOpencode -or $installClaudecode -or $installCursor -or $installVibe) -and $PluginsScope -eq 'global') {
|
|
310
|
+
if (Prompt-YesNo "Install project-local (./.opencode, ./.claude, ./.cursor, ./.vibe) instead of global?" $false) {
|
|
305
311
|
$PluginsScope = 'project'
|
|
306
312
|
}
|
|
307
313
|
}
|
|
@@ -349,8 +355,11 @@ if ($installClaudecode) {
|
|
|
349
355
|
if ($installCursor) {
|
|
350
356
|
Invoke-PluginInstaller 'plugins/cursor/install.sh' 'Cursor' 'scope'
|
|
351
357
|
}
|
|
352
|
-
if (
|
|
353
|
-
|
|
358
|
+
if ($installVibe) {
|
|
359
|
+
Invoke-PluginInstaller 'plugins/vibe/install.sh' 'Mistral Vibe' 'scope'
|
|
360
|
+
}
|
|
361
|
+
if (-not $installOpencode -and -not $installClaudecode -and -not $installCursor -and -not $installVibe) {
|
|
362
|
+
Warn "no harness plugin installed; re-run with -Plugins all (or =opencode/=claudecode/=cursor/=vibe) later"
|
|
354
363
|
}
|
|
355
364
|
|
|
356
365
|
# ---------- done ----------
|
|
@@ -326,10 +326,11 @@ step "Agent harness plugins"
|
|
|
326
326
|
# PLUGINS_ARG="" → interactive (only if stdin is a TTY)
|
|
327
327
|
# PLUGINS_ARG="none" → skip
|
|
328
328
|
# PLUGINS_ARG="all" → both
|
|
329
|
-
# PLUGINS_ARG="opencode,claudecode,cursor" → comma-separated whitelist
|
|
329
|
+
# PLUGINS_ARG="opencode,claudecode,cursor,vibe" → comma-separated whitelist
|
|
330
330
|
INSTALL_OPENCODE=0
|
|
331
331
|
INSTALL_CLAUDECODE=0
|
|
332
332
|
INSTALL_CURSOR=0
|
|
333
|
+
INSTALL_VIBE=0
|
|
333
334
|
|
|
334
335
|
resolve_plugin_selection() {
|
|
335
336
|
local raw="$1"
|
|
@@ -338,6 +339,7 @@ resolve_plugin_selection() {
|
|
|
338
339
|
INSTALL_OPENCODE=1
|
|
339
340
|
INSTALL_CLAUDECODE=1
|
|
340
341
|
INSTALL_CURSOR=1
|
|
342
|
+
INSTALL_VIBE=1
|
|
341
343
|
return 0
|
|
342
344
|
fi
|
|
343
345
|
IFS=',' read -r -a parts <<< "$raw"
|
|
@@ -346,8 +348,9 @@ resolve_plugin_selection() {
|
|
|
346
348
|
opencode) INSTALL_OPENCODE=1 ;;
|
|
347
349
|
claudecode|claude|claude-code) INSTALL_CLAUDECODE=1 ;;
|
|
348
350
|
cursor) INSTALL_CURSOR=1 ;;
|
|
351
|
+
vibe|mistral|mistral-vibe) INSTALL_VIBE=1 ;;
|
|
349
352
|
"" ) ;;
|
|
350
|
-
*) warn "unknown plugin '$p' (expected: opencode, claudecode, cursor, all, none)" ;;
|
|
353
|
+
*) warn "unknown plugin '$p' (expected: opencode, claudecode, cursor, vibe, all, none)" ;;
|
|
351
354
|
esac
|
|
352
355
|
done
|
|
353
356
|
}
|
|
@@ -361,8 +364,9 @@ elif [ -t 0 ] && [ -t 1 ]; then
|
|
|
361
364
|
if prompt_yes_no "Install OpenCode plugin?" "y"; then INSTALL_OPENCODE=1; fi
|
|
362
365
|
if prompt_yes_no "Install Claude Code plugin?" "y"; then INSTALL_CLAUDECODE=1; fi
|
|
363
366
|
if prompt_yes_no "Install Cursor plugin?" "y"; then INSTALL_CURSOR=1; fi
|
|
364
|
-
if
|
|
365
|
-
|
|
367
|
+
if prompt_yes_no "Install Mistral Vibe plugin?" "y"; then INSTALL_VIBE=1; fi
|
|
368
|
+
if [ "$INSTALL_OPENCODE" -eq 1 ] || [ "$INSTALL_CLAUDECODE" -eq 1 ] || [ "$INSTALL_CURSOR" -eq 1 ] || [ "$INSTALL_VIBE" -eq 1 ]; then
|
|
369
|
+
if prompt_yes_no "Install project-local (./.opencode, ./.claude, ./.cursor, ./.vibe) instead of global?" "n"; then
|
|
366
370
|
PLUGINS_SCOPE="project"
|
|
367
371
|
fi
|
|
368
372
|
fi
|
|
@@ -411,8 +415,22 @@ if [ "$INSTALL_CURSOR" -eq 1 ]; then
|
|
|
411
415
|
fi
|
|
412
416
|
fi
|
|
413
417
|
|
|
414
|
-
if [ "$
|
|
415
|
-
|
|
418
|
+
if [ "$INSTALL_VIBE" -eq 1 ]; then
|
|
419
|
+
if [ -x "$PROJECT_ROOT/plugins/vibe/install.sh" ]; then
|
|
420
|
+
# The vibe installer uses `--scope user|project`, like cursor.
|
|
421
|
+
vibe_flags=""
|
|
422
|
+
[ "$PLUGINS_SCOPE" = "project" ] && vibe_flags="$vibe_flags --scope project"
|
|
423
|
+
[ "$SKIP_MCP" -eq 1 ] && vibe_flags="$vibe_flags --no-mcp"
|
|
424
|
+
# shellcheck disable=SC2086 # intentional word-splitting on flag string
|
|
425
|
+
"$PROJECT_ROOT/plugins/vibe/install.sh" $vibe_flags
|
|
426
|
+
ok "Mistral Vibe plugin installed ($PLUGINS_SCOPE)"
|
|
427
|
+
else
|
|
428
|
+
warn "plugins/vibe/install.sh not executable; skipping"
|
|
429
|
+
fi
|
|
430
|
+
fi
|
|
431
|
+
|
|
432
|
+
if [ "$INSTALL_OPENCODE" -eq 0 ] && [ "$INSTALL_CLAUDECODE" -eq 0 ] && [ "$INSTALL_CURSOR" -eq 0 ] && [ "$INSTALL_VIBE" -eq 0 ]; then
|
|
433
|
+
warn "no harness plugin installed; re-run with --plugins=all (or =opencode/=claudecode/=cursor/=vibe) later"
|
|
416
434
|
fi
|
|
417
435
|
|
|
418
436
|
# ---------- done ----------
|