All notable changes to this project will be documented in this file.
- Windsurf "no tools returned" — Transport-first architecture caused Windsurf to query
tools/listbefore tools were registered. Normal path now registers tools first, then connects transport. Roots path (invalid cwd) still connects first to querylistRoots. - Windsurf rules not activated — Generated
.windsurf/rules/memorix.mdlacked YAML frontmatter (trigger: always_on). Windsurf ignored the file without it. Also addedalwaysApply: truefrontmatter for Cursor.mdcfiles. - Windsurf hook
post_commandcontent too short — Normalizer didn't extractcommandOutputfrom Windsurfpost_commandevents, causing content to be <30 chars and filtered out. - Hook hot-reload broken on Windows —
fs.watch()lost track ofobservations.jsonafteratomicWriteFile(which usesrename()). Switched tofs.watchFilewith 2s polling for reliable cross-platform hot-reload. Hook-written memories are now searchable within ~4 seconds.
- Self-referential command noise — Bash commands that inspect memorix's own data (e.g.
node -e "...observations.json...",cat ~/.memorix/...) were being stored as observations, creating a feedback loop. Now filtered alongsidememorix_internaltools.
- Session activity noise — Empty
session_endevents were unconditionally stored, generating ~8.5% of all observations as useless"Session activity (discovery)"entries. Now requires content ≥ 50 chars, matching the quality-first philosophy of 0.9.16.
- Classify → Policy → Store pipeline — Replaced the monolithic
switch/casehandler (527 lines) with a clean declarative pipeline (432 lines). Inspired by claude-mem's store-first philosophy and mcp-memory-service's configurable scoring. - Tool Taxonomy —
classifyTool()categorizes tools intofile_modify | file_read | command | search | memorix_internal | unknown. Each category has a declarativeStoragePolicy(store mode, minLength, defaultType). - Pattern detection = classification only — Pattern detection now only determines observation type (decision, error, etc.), not whether to store. Storage decisions are made by policy.
- Unified
TYPE_EMOJI— Single exported constant, eliminating 3 duplicated copies across handler and session_start.
- 🔴 Critical: Bash commands with
cdprefix silently dropped — Claude Code sends Bash commands ascd /project && npm test 2>&1. The noise filter/^cd\b/matched thecdprefix and silently discarded the entire command. This causednpm test,npm install express,node -e "...", and all other project-scoped commands to never be stored. Fix:extractRealCommand()stripscd path &&prefix before noise checking, socd /path && npm testis correctly evaluated asnpm test. - Cooldown key too broad — Old key
post_tool:Bashmeant ALL Bash commands shared one 30-second cooldown. New key usesevent:filePath|command|toolName, sonpm testandnpm installhave independent cooldowns. - Store-first for commands — Command-category tools now use
store: 'always'policy with minLength 30 (down from 50-200), capturing more meaningful development activity.
- Feedback visibility — Hook auto-stores were silent. Now returns
systemMessageto the agent after each save, e.g.🟢 Memorix saved: Updated auth.ts [what-changed]. Gives Codex-like visibility into what memorix is recording. - File-modifying tools always store — Write/Edit/MultiEdit tool events were rejected when content lacked pattern keywords (e.g., writing utility functions with no "error"/"fix" keywords). Now file-modifying tools always store if content > 100 chars, classified as
what-changedby default. - PreCompact low-quality spam — PreCompact events stored empty/minimal observations with no meaningful content. Now requires
MIN_STORE_LENGTH(100 chars) to store. - Normalizer prompt extraction —
normalizeClaudeonly extractedpromptforuser_promptevents. Now extracts for all events (PreCompact, etc.), preserving context that would otherwise be lost.
- 🔴 Critical: Hooks never auto-store during development — Two root causes:
extractContent()had a fatalparts.length === 0guard that skipped richtoolInputdata (file content, edit diffs, commands) whenevertoolResultwas present. Since all agents send shorttoolResultlike"File written successfully"(28 chars), the content was always < 100 chars and got rejected byMIN_STORE_LENGTH.- Bash/shell tool events (npm install, npm test, git commands) also got rejected because their content (~90 chars) fell below the generic
post_toolthreshold of 200 chars, even though commands are inherently meaningful.
- Fix: Always extract
toolInputfields alongsidetoolResult. Bash tools now use a dedicated low-threshold path (50 chars) with noise command filtering, matching thepost_commandlogic.
- 12 Claude Code E2E tests — Validates the full hook pipeline (stdin JSON → normalize → handleHookEvent → observation) for Write, Edit, Bash, UserPromptSubmit, SessionStart, Stop, PreCompact, and edge cases (noise filtering, memorix recursion skip, short prompts).
- Copilot hooks format completely wrong — Was reusing Claude Code's
generateClaudeConfig()(PascalCase events,commandfield). Copilot requiresversion: 1,bash/powershellfields,timeoutSec, and camelCase event names (sessionStart,userPromptSubmitted,preToolUse,postToolUse,sessionEnd,errorOccurred). Now uses dedicatedgenerateCopilotConfig(). Source: GitHub Docs. - Codex fake hooks.json removed — Codex has no hooks system (only
notifyin config.toml foragent-turn-complete). Was generating a non-existent.codex/hooks.json. Now only installs rules (AGENTS.md). Source: OpenAI Codex Config Reference. - Kiro hook file extension wrong — Was
.hook.md, should be.kiro.hook. Now generates 3 hook files:memorix-agent-stop.kiro.hook(session memory),memorix-prompt-submit.kiro.hook(context loading),memorix-file-save.kiro.hook(file change tracking). Source: Kiro Docs. - Kiro only had 1 event — Was only
file_saved. Now coversagent_stop,prompt_submit, andfile_saveevents.
- Antigravity/Gemini CLI hook installer — New
generateGeminiConfig()for.gemini/settings.json. PascalCase events (SessionStart,AfterTool,AfterAgent,PreCompress), timeout in milliseconds (10000ms). Source: Gemini CLI Docs. - Copilot normalizer — Dedicated
normalizeCopilot()function withinferCopilotEvent()for payload-based event detection (Copilot sends typed payloads without explicit event names). - Gemini CLI normalizer — Dedicated
normalizeGemini()function with event mapping for all 11 Gemini CLI events (BeforeAgent,AfterAgent,BeforeTool,AfterTool,PreCompress, etc.). - Gemini CLI event mappings — Full EVENT_MAP entries for Gemini CLI PascalCase events → normalized events.
- Copilot event mappings — EVENT_MAP entries for Copilot-specific camelCase events (
userPromptSubmitted,preToolUse,postToolUse,errorOccurred).
- CLI crashes with
Dynamic require of "fs" is not supported— When bundling CJS dependencies (likegray-matter) into ESM output vianoExternal, esbuild's CJS-to-ESM wrapper couldn't resolve Node.js built-in modules. AddedcreateRequirebanner to provide a realrequirefunction before esbuild's wrapper runs, fixingrequire('fs')and other built-in module calls.
- CLI crashes with
ERR_MODULE_NOT_FOUNDon global install —@orama/orama,gpt-tokenizer,gray-matterand other dependencies were not bundled into the CLI output. tsup treateddependenciesas external by default. AddednoExternalto force-bundle all deps into CLI (275KB → 2.59MB), makingmemorix hookwork reliably when installed globally vianpm install -g. - Cursor agent detection corrected — Real Cursor payload confirmed to include
hook_event_name+conversation_id(not justworkspace_roots). Detection now usesconversation_idorcursor_versionas primary discriminator vs Claude Code (which sendssession_idwithoutconversation_id).extractEventNamereadshook_event_namefirst, falls back to payload inference.
- Cursor hooks config format invalid — Generated config was missing required
versionfield and used objects instead of arrays for hook scripts. Cursor requires{ version: 1, hooks: { eventName: [{ command: "..." }] } }format. AddedsessionStart,beforeShellExecution,afterMCPExecution,preCompactevents. - Cursor agent detection failed — Cursor does NOT send
hook_event_namelike Claude Code. Detection now uses Cursor-specific fields (workspace_roots,is_background_agent,composer_mode). Event type inferred from payload structure (e.g.,old_content/new_content→afterFileEdit). - Cursor
session_idfield not read — Normalizer expectedconversation_idbut Cursor sendssession_id. Now reads both with fallback.
- Claude Code hooks installed to wrong file — Hooks were written to
.github/hooks/memorix.jsonbut Claude Code reads from.claude/settings.local.json(project-level) or~/.claude/settings.json(global). Now correctly writes to.claude/settings.local.jsonfor project-level installation. - Hooks merge overwrites existing settings — Shallow spread
{...existing, ...generated}would overwrite the entirehookskey, destroying user's other hook configurations. Now deep-merges thehooksobject so existing hooks from other tools are preserved.
- Claude Code hooks never triggering auto-memory — Claude Code sends
hook_event_name(snake_case) but the normalizer expectedhookEventName(camelCase). This caused every event (SessionStart, UserPromptSubmit, PostToolUse, PreCompact, Stop) to be misidentified aspost_tool, breaking event routing, prompt extraction, memory injection, and session tracking. Also fixedsession_id→sessionIdandtool_response→toolResultfield mappings. - Empty content extraction from Claude Code tool events —
extractContent()now unpackstoolInputfields (Bash commands, Write file content, etc.) when no other content is available. Previously tool events produced empty or near-empty content strings. - User prompts silently dropped —
MIN_STORE_LENGTH=100was too high for typical user prompts. AddedMIN_PROMPT_LENGTH=20specifically foruser_promptevents. - Post-tool events too aggressively filtered — Tool events with substantial content (>200 chars) are now stored even without keyword pattern matches.
- Cross-IDE project identity fragmentation — Data was stored in per-project subdirectories (
~/.memorix/data/<projectId>/), but different IDEs often detected different projectIds for the same repo (e.g.placeholder/repovslocal/repovslocal/Kiro). This caused observations to silently split across directories, making cross-IDE relay unreliable. Now all data is stored in a single flat directory (~/.memorix/data/). projectId is metadata only, not used for directory partitioning. Existing per-project subdirectories are automatically merged on first startup (IDs remapped, graphs deduplicated, subdirs backed up to.migrated-subdirs/). scope: 'project'parameter now works — Previously accepted but ignored. Now properly filters search results by the current project's ID via Orama where-clause.
- Claude Code hooks
matcherformat —matchermust be a string (tool name pattern like"Bash","Edit|Write"), not an object. For hooks that should fire on ALL events,matcheris now omitted entirely instead of using{}. Fixesmatcher: Expected string, but received objectvalidation error on Claude Code startup.
- Codex/all-IDE
tools/list -> Method not found— Critical bug wherelocal/<dirname>projects (any directory without a git remote) wrongly entered the MCP roots resolution flow. This flow connects the server before registering tools, so the MCPinitializehandshake declared notoolscapability, causing all subsequenttools/listcalls to fail with "Method not found". Now only truly invalid projects (home dir, system dirs) enter the roots flow;local/projects go through the normal path (register tools first, then connect).
memorix_timeline"not found" bug — Timeline was using unreliable Orama empty-term search. Now uses in-memory observations (same fix pattern asmemorix_detail).memorix_retention"no observations found" bug — Same root cause as timeline. Now uses in-memory observations for reliable document retrieval.memorix_searchcross-IDE projectId mismatch — Removed redundant projectId filter from search. Data isolation is already handled at the directory level. Different IDEs resolving different projectIds for the same directory no longer causes empty search results.- Claude Code hooks format — Updated
generateClaudeConfigto use the new{matcher: {}, hooks: [...]}structure required by Claude Code 2025+. Fixes "Expected array, but received undefined" error onmemorix hooks install --agent claude --global. - EPERM
process.cwd()crash — All CLI commands (serve,hooks install/uninstall/status) now safely handleprocess.cwd()failures (e.g., deleted CWD on macOS) with fallback to home directory.
- Empty directory support — Memorix now starts successfully in any directory, even without
.gitorpackage.json. No more__invalid__project errors for brand new folders. Only truly dangerous directories (home dir, drive root, system dirs) are rejected. findPackageRootsafety — Walking up from temp/nested directories no longer accidentally selects the home directory as project root.
- README rewrite — Complete rewrite of Quick Start section for both EN and 中文 READMEs:
- Two-step install (global install + MCP config) instead of error-prone
npx - Per-agent config examples (Claude Code, Cursor, Windsurf, etc.)
- Troubleshooting table for common errors
- AI-friendly: agents reading the README will now configure correctly on first try
- Two-step install (global install + MCP config) instead of error-prone
- Defensive parameter coercion — All 24 MCP tools now gracefully handle string-encoded arrays and numbers (e.g.,
"[16]"→[16],"20"→20). Fixes compatibility with Claude Code CLI's known serialization bug (#5504, #26027) and non-Anthropic models (GLM, etc.) that may produce incorrectly typed tool call arguments. Codex, Windsurf, and Cursor were already unaffected.
- Memory Consolidation (
memorix_consolidate) — Find and merge similar observations to reduce memory bloat. Uses Jaccard text similarity to cluster observations by entity+type, then merges them preserving all facts, files, and concepts. Supportspreview(dry run) andexecutemodes with configurable similarity threshold. - Temporal Queries —
memorix_searchnow supportssinceanduntilparameters for date range filtering. Example: "What auth decisions did we make last week?" - Explainable Recall — Search results now include a
Matchedcolumn showing which fields matched the query (title, entity, concept, narrative, fact, file, or fuzzy). Helps understand why each result was found. - Export/Import — Two new tools for team collaboration:
memorix_export— Export project observations and sessions as JSON (importable) or Markdown (human-readable for PRs/docs)memorix_import— Import from JSON export, re-assigns IDs, skips duplicate topicKeys
- Dashboard Sessions Panel — New "Sessions" tab in the web dashboard with timeline view, active/completed counts, agent info, and session summaries. Bilingual (EN/中文).
- Auto sessionId —
memorix_storenow automatically associates the current active session's ID with stored observations. - 16 new tests — 8 consolidation + 8 export/import (484 total).
- MCP Tools: 20 → 24 (memorix_consolidate, memorix_export, memorix_import + dashboard sessions API)
- Tests: 484/484 passing
- Session Lifecycle Management — 3 new MCP tools for cross-session context continuity:
memorix_session_start— Start a coding session, auto-inject context from previous sessions (summaries + key observations). Previous active sessions are auto-closed.memorix_session_end— End a session with structured summary (Goal/Discoveries/Accomplished/Files format). Summary is injected into the next session.memorix_session_context— Manually retrieve session history and context (useful after compaction recovery).
- Topic Key Upsert —
memorix_storenow accepts an optionaltopicKeyparameter. When an observation with the sametopicKey + projectIdalready exists, it is updated in-place instead of creating a duplicate.revisionCountincrements on each upsert. Prevents data bloat for evolving decisions, architecture docs, etc. memorix_suggest_topic_keytool — Suggests stable topic keys from type + title using family heuristics (architecture/*,bug/*,decision/*,config/*,discovery/*,pattern/*). Supports CJK characters.- Session persistence —
sessions.jsonwith atomic writes and file locking for cross-process safety. - Observation fields —
topicKey,revisionCount,updatedAt,sessionIdadded toObservationinterface. - 30 new tests — 16 session lifecycle tests + 14 topic key upsert tests (468 total).
storeObservationAPI — Now returns{ observation, upserted }instead of justObservation, enabling callers to distinguish new vs updated observations.
- Engram — Session lifecycle design, topic_key upsert pattern, structured session summaries.
- File locking & atomic writes (
withFileLock,atomicWriteFile) — Cross-process safe writes forobservations.json,graph.jsonl, andcounter.json. Uses.memorix.lockdirectory lock with stale detection (10s timeout) and write-to-temp-then-rename for crash safety. - Retention auto-archive —
memorix_retentiontool now supportsaction="archive"to move expired observations toobservations.archived.json. Reversible — archived memories can be restored manually. - Chinese entity extraction — Entity extractor now recognizes Chinese identifiers in brackets (
「认证模块」,【数据库连接】) and backticks, plus Chinese causal language patterns (因为/所以/由于/导致/决定/采用). - Graph-memory bidirectional sync — Dashboard DELETE now cleans up corresponding
[#id]references from knowledge graph entities. Prevents orphaned data.
- Search accuracy — Added fuzzy tolerance, field boosting (title > entityName > concepts > narrative), lowered similarity threshold to 0.5, tuned hybrid weights (text 0.6, vector 0.4).
- Auto-relations performance — Entity lookups now use O(1) index (
Map) instead of O(n)find()on every observation store.KnowledgeGraphManagermaintains aentityIndexrebuilt on create/delete mutations. - Re-read-before-write —
storeObservationre-readsobservations.jsoninside the lock before writing, merging concurrent changes instead of overwriting.
- Chinese README (
README.zh-CN.md) — Full bilingual documentation with language switcher at the top of both README files. - Antigravity config guide — Collapsible note in README Quick Start and updated
docs/SETUP.mdAntigravity section explaining theMEMORIX_PROJECT_ROOTrequirement, why it's needed (cwd + MCP roots both unavailable), and how to configure it. - Project detection priority documentation — Clear detection chain (
--cwd→MEMORIX_PROJECT_ROOT→INIT_CWD→process.cwd()→ MCP roots → error) in README, SETUP.md, and troubleshooting section.
- Dashboard auto-switch when project changes — When the dashboard is already running (started from project A) and
memorix_dashboardis called from project B, the dashboard server's current project is now updated via a/api/set-current-projectPOST request before opening the browser. Previously, the dashboard always showed the project it was initially started with; now it correctly switches to the calling project. Existing browser tabs will also show the correct project on the next page load/refresh.
- MCP roots protocol support — When the IDE's
cwdis not a valid project (e.g., Antigravity sets cwd toG:\Antigravity), Memorix now automatically tries the MCProots/listprotocol to get the IDE's actual workspace path. This means standard MCP configs (npx memorix@latest serve) can work without--cwdin IDEs that support MCP roots. Falls back gracefully if the client doesn't support roots. Priority chain:--cwd>MEMORIX_PROJECT_ROOT>INIT_CWD>process.cwd()> MCP roots > error.
- Graceful error on invalid project detection — When
detectProject()returns__invalid__(e.g., IDE sets cwd to its own install directory likeG:\Antigravity), the server now prints a clear, actionable error message with fix instructions (--cwdorMEMORIX_PROJECT_ROOT) instead of crashing with an opaque stack trace. - Dashboard process liveness check —
memorix_dashboardnow verifies the port is actually listening before returning "already running". If the dashboard process was killed externally (e.g.,taskkill), it automatically restarts instead of opening a browser to a dead server.
MEMORIX_PROJECT_ROOTenvironment variable — New way to specify the project directory for IDEs that don't setcwdto the project path (e.g., Antigravity usesG:\Antigravityas cwd). Priority:--cwd>MEMORIX_PROJECT_ROOT>INIT_CWD>process.cwd(). Example MCP config:"env": { "MEMORIX_PROJECT_ROOT": "e:/your/project" }.
- Wrong project detection in Antigravity/global MCP configs — Removed dangerous
scriptDirfallback inserve.tsthat caused the MCP server to detect the memorix development repo (or other wrong projects) instead of the user's actual project. Whenprocess.cwd()was not a git repo, the old code fell back to the memorix script's own directory, which could resolve to a completely unrelated project. Now relies solely ondetectProject()which has proper fallback logic. - Dashboard always showing wrong project — When re-opening the dashboard (already running on port 3210), it now passes the current project as a
?project=URL parameter. The frontend reads this parameter and auto-selects the correct project in the switcher, so opening dashboard from different IDEs/projects shows the right data.
llms.txt+llms-full.txt— Machine-readable project documentation for AI crawlers (2026 llms.txt standard). Helps Gemini, GPT, Claude, and other AI systems discover and understand Memorix automatically.- FAQ semantic anchors in README — 7 Q&A entries matching common AI search queries ("How do I keep context when switching IDEs?", "Is there an MCP server for persistent AI coding memory?", etc.)
- GitHub repo description — Shortened to ~150 chars for optimal og:title/og:description generation
- GitHub topics — 20 GEO-optimized tags including
cursor-mcp,windsurf-mcp,claude-code-memory,cross-ide-sync,context-persistence,agent-memory - package.json keywords — Replaced generic tags with IDE-specific MCP entity-linking keywords
- package.json description — Shortened to under 160 chars for better meta tag generation
- MCP tool descriptions — Enhanced
memorix_store,memorix_search,memorix_workspace_sync,memorix_skillswith cross-IDE context so AI search engines understand what problems they solve
- README rewrite — Completely restructured to focus on real-world scenarios, use cases, and features. Added 5 walkthrough scenarios, comparison table with alternatives, "Works with" badges for all 7 agents. Moved detailed config to sub-README.
- New
docs/SETUP.md— Dedicated setup guide with agent-specific config, vector search setup, data storage, and troubleshooting
- Hyphenated concepts not searchable — Concepts like
project-detectionandbug-fixare now normalized toproject detectionandbug fixin the search index so Orama's tokenizer can split them into individual searchable terms. Original observation data is preserved unchanged.
- Windows: git remote detection fails due to "dubious ownership" — Added
safe.directory=*flag to all git commands so MCP subprocess can read git info regardless of directory ownership settings. If git CLI still fails, falls back to directly parsing.git/configfile. This fixes projects incorrectly gettinglocal/<dirname>instead ofowner/repoas their project ID.
memorix_workspace_syncrejectskiroas target — AddedkirotoAGENT_TARGETSenum (adapter was already implemented but missing from the tool's input schema)memorix_rules_syncmissingkirotarget — AddedkirotoRULE_SOURCESenum so Kiro steering rules can be generated as a sync target- VS Code Copilot README config — Separated
.vscode/mcp.json(workspace) andsettings.json(global) formats which have different JSON structures
- Dashboard checkbox checkmark not visible — Added
position: relative/absoluteto.obs-checkbox::afterso the ✓ renders correctly in batch select mode - Embedding provider status flickers to "fulltext only" — Replaced
initializedboolean flag with a shared Promise lock; concurrent callers now wait for the same initialization instead of seeingprovider = nullmid-load memorix_dashboardMCP tool reliability — Replaced fixed 800ms wait with TCP port polling (up to 5s) so the tool only returns after the HTTP server is actually listening- Dashboard embedding status always shows "fulltext only" — Fixed root cause: dashboard is an independent process,
isEmbeddingEnabled()from orama-store always returns false there; now usesprovider !== nulldirectly
- Memory-Driven Skills Engine (
memorix_skillsMCP tool):list— Discover allSKILL.mdfiles across 7 agent directoriesgenerate— Auto-generate project-specific skills from observation patterns (gotchas, decisions, how-it-works)inject— Return full skill content directly to agent context- Intelligent scoring: requires skill-worthy observation types, not just volume
- Write to any target agent with
write: true, target: "<agent>"
- Transformers.js Embedding Provider:
- Pure JavaScript fallback (
@huggingface/transformers) — no native deps required - Provider chain:
fastembed→transformers.js→ fulltext-only - Quantized model (
q8) for small footprint
- Pure JavaScript fallback (
- Dashboard Enhancements:
- Canvas donut chart for observation type distribution
- Embedding provider status card (enabled/provider/dimensions)
- Search result highlighting with
<mark>tags
- 17 new tests for Skills Engine (list, generate, inject, write, scoring, dedup)
- Scoring algorithm requires at least 1 skill-worthy type (gotcha/decision/how-it-works/problem-solution/trade-off) — pure discovery/what-changed entities won't generate skills
- Volume bonus reduced from 2×obs to 1×obs (capped at 5) to favor quality over quantity
- Type diversity bonus increased from 2 to 3 points per unique skill-worthy type
- 422 tests passing (up from 405), 34 test files, zero regressions
- Antigravity Adapter: Full support for Antigravity/Gemini IDE (MCP config + rules)
- Copilot Adapter: VS Code Copilot MCP config adapter + rules format adapter
- Comprehensive Documentation: 7 developer docs in
docs/(Architecture, Modules, API Reference, Design Decisions, Development Guide, Known Issues & Roadmap, AI Context) - 8 new npm keywords: antigravity, mcp-tool, memory-layer, ai-memory, progressive-disclosure, orama, vector-search, bm25
prepublishOnlynow runsnpm testin addition to build
- README completely rewritten with clearer structure, npx zero-install setup, 6 agent configs, comparison table, Progressive Disclosure example, and architecture diagram
descriptionfield expanded for better npm search rankingfilesarray cleaned up (removed unusedexamplesdirectory)
- 274 tests passing (up from 219), zero regressions
- Knowledge Graph: Entity-Relation-Observation model (MCP Official compatible)
- 3-Layer Progressive Disclosure: compact search → timeline → detail
- 9 observation types with icon classification
- Full-text search via Orama (BM25)
- Per-project isolation via Git remote detection
- 14 MCP tools (9 official + 5 Memorix extensions)
- Rules Parser: 4 format adapters (Cursor, Claude Code, Codex, Windsurf)
- Rules Syncer: scan → deduplicate → conflict detection → cross-format generation
- Workspace Sync: MCP config migration + workflow sync + apply with backup/rollback
- Access tracking: accessCount + lastAccessedAt (from mcp-memory-service)
- Token budget: maxTokens search trimming (from MemCP)
- Memory decay: exponential decay + retention lifecycle + immunity (from mcp-memory-service + MemCP)
- Entity extraction: regex-based file/module/URL/CamelCase extraction (from MemCP)
- Auto-enrichment: memorix_store auto-extracts and enriches concepts/files
- Causal detection: "because/due to/caused by" pattern detection
- Auto-relations: implicit Knowledge Graph relation creation (causes/fixes/modifies)
- Retention status: memorix_retention MCP tool
- Embedding provider abstraction layer (extensible)
- fastembed integration (optional, local ONNX, 384-dim bge-small)
- Orama hybrid search mode (BM25 + vector)
- Graceful degradation: no fastembed → fulltext only
- Embedding cache (5000 entries LRU)
- CLAUDE.md: Claude Code usage instructions + lifecycle hooks
- Example configs for Cursor, Windsurf, Codex