memorix 1.0.6 → 1.0.8

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.
package/CHANGELOG.md CHANGED
@@ -2,46 +2,163 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
- ## [Unreleased]
6
-
7
- ### Fixed
8
- - **API-first auto embedding selection** `MEMORIX_EMBEDDING=auto` now prefers a configured remote embedding API before falling back to local `fastembed` or `transformers`, preventing unexpected local-model activation when API credentials are already present.
9
- - **Embedding cache isolation across config changes** API embedding cache keys and probe-dimension metadata now stay isolated per `baseUrl + model + requestedDimensions`, so switching between shortened and native dimensions no longer reuses stale cached embeddings or stale dimension probes.
5
+ ## [1.0.8] - 2026-04-19
6
+
7
+ ### Added -- Operator CLI Surface
8
+ - **Namespaced operator commands** -- Added human-oriented CLI namespaces for `session`, `memory`, `reasoning`, `retention`, `formation`, `audit`, `transfer`, `skills`, `team`, `task`, `message`, `lock`, `handoff`, `poll`, `sync`, and `ingest` so Memorix-native operations no longer require raw MCP tool calls.
9
+ - **Lightweight session start + explicit collaboration join** -- `memorix session start` now opens project-bound memory sessions without auto-registering a team identity. Operators can opt into collaboration with `--joinTeam`, or join later via `memorix team join`, while still getting default role mapping from `agentType` when they do join.
10
+ - **CLI-first project ops** -- Terminal operators can now inspect memory detail/timeline, store and search reasoning traces, run retention and formation checks, audit attribution, export/import memory snapshots, inspect/generate skills, run explicit rules/workspace sync flows, and ingest images without leaving the shell.
11
+
12
+ ### Added -- Programmatic SDK
13
+ - **`memorix/sdk` subpath export** -- `createMemoryClient()` factory returns a self-contained `MemoryClient` with `store`, `search`, `get`, `getAll`, `count`, `resolve`, and `close` methods. No MCP transport or CLI needed — initialize from a Git project root, read/write observations directly.
14
+ - **`createMemorixServer` re-export** -- Embed the full MCP server into your own Node.js process and connect it to any transport.
15
+ - **`detectProject` re-export** -- Standalone Git-based project detection.
16
+ - **Three subpath exports** -- `memorix/sdk` (runtime API + types), `memorix/types` (type-only), `memorix` (MCP stdio entry).
17
+
18
+ ### Added -- Official Docker Deployment
19
+ - **Official HTTP control-plane container path** -- `Dockerfile` now builds a real `serve-http` runtime image instead of defaulting to stdio MCP.
20
+ - **Compose example** -- added `compose.yaml` with port `3211`, persistent data volume, and `/health` healthcheck.
21
+ - **Docker docs** -- added `docs/DOCKER.md` and linked Docker deployment from README / setup docs.
22
+ - **Runtime truth** -- documentation now explicitly states that Docker support is for the HTTP control plane and that project-scoped Git/config behavior requires the container to see the bound repo path.
23
+
24
+ ### Visual Semantic Layering (dashboard follow-up)
25
+ - Team mental model tightened before release: docs and dashboard copy now say "explicit collaborators" instead of implying a persistent IDE-window roster.
26
+ - `memorix team status` now defaults to active collaborators only; inactive/historical identities remain available with `--all` for audits without flooding the normal operator view.
27
+ - Team page headline is now **active-only**; `recent`/`historical` shown as secondary subtitle only.
28
+ - Team agents list gets four filter tabs: **Active** (default) / Recent / Historical / All. Historical rows no longer flood the view; they sit behind an explicit "Show historical (N)" toggle.
29
+ - Each agent row carries an explicit tier badge (Active/Recent/Historical) instead of a single "offline" sea of red.
30
+ - Historical agent rows are de-emphasized (reduced opacity, muted colors) so they don't dominate the main view.
31
+ - Identity page headline shows **real** project count + **real** alias groups only. Temporary/placeholder IDs moved into a collapsed "Historical / temporary project IDs" section.
32
+ - Identity "Dirty IDs" card now splits current-project dirty (primary) from historical dirty (secondary) so a single placeholder no longer looks like an active problem.
33
+ - Project switcher groups items into **Current / Real projects / Temporary / Placeholder**, with temporary and placeholder folded behind a "Show temporary" toggle. Each group has a visible count so users can tell a real project list apart from the historical test/smoke scratch pile.
34
+ - All new labels wired through the i18n system (English + Simplified Chinese).
35
+
36
+ ### Team Page Cleanup (1.0.7 final)
37
+ - **Team page semantics**: clearly presented as a **project collaboration space**, not an organization backend or staffing admin tool. Scope labels: "Project Collaboration" / "All Projects".
38
+ - **Explicit collaboration join**: `memorix_session_start` is lightweight by default and no longer auto-registers a team identity. Collaboration is now opt-in via `joinTeam: true` or `team_manage(join)`, and default role mapping from `agentType` applies only when joining.
39
+ - **"Continue This Project" resume area**: shows open tasks, available-to-claim tasks, open handoffs, unread messages, active locks, and active agent count at the top of the Team page. Provides a clear "pick up where you left off" entry point.
40
+ - **Unified statistics**: stat cards clearly labeled — Active Agents (with session count + historical total), Locked Files, Tasks (by status), Messages (unread count). No conflicting or ambiguous labels.
41
+
42
+ ### Added -- Multi-Agent Orchestrator (Phase 7)
43
+ - **`memorix orchestrate`** -- Autonomous pipeline: plan → parallel execution → verify gates → fix loops → review → merge. 4 agent adapters (Claude, Codex, Gemini, OpenCode), capability routing with quotas, worktree isolation, evidence collection, stranded task detection, agent fallback on repeated failures.
44
+ - **CLI flags**: `--agents claude:2,codex:1`, `--goal`, `--parallel`, `--compile-command`, `--test-command`, `--max-fix`, `--budget`, `--routing`, `--memory-capture`, `--no-evidence`, `--global-timeout`
45
+
46
+ ### Added -- SQLite Canonical Store (Phase 2)
47
+ - Observations, mini-skills, sessions, archives all in SQLite. Shared DB handle, freshness-safe retrieval, in-place archiving.
48
+
49
+ ### Added -- Team Identity (Phase 4)
50
+ - Team store with agent registration, heartbeat, task board, handoff artifacts, stale detection. Prompt identity contract, sticky attribution prevention.
51
+
52
+ ### Fixed
53
+ - **HTTP stale-session poisoning (#82)** — `serve-http` no longer has only a hardcoded 30-minute idle GC. Added `MEMORIX_SESSION_TIMEOUT_MS` so long-running HTTP MCP clients such as Codex can keep sessions alive for longer work blocks without getting stuck on stale `Mcp-Session-Id` failures.
54
+ - **TUI responsive layout** — sidebar width now scales with terminal width (28% ratio, 26-40 range) instead of fixed 34 columns; content area uses `flexGrow` to fill remaining space; maximized terminal windows now show expanded UI instead of locked small-window layout
55
+ - **TUI search score display** — replaced absurd raw-percentage display (e.g. "927%") with relative relevance dots (●●●○○) normalized against top result
56
+ - **TUI /resume numeric index** — `/resume 2` now selects thread #2 from the list (1-based), in addition to `/resume <threadId>` by ID
57
+ - **TUI CJK text wrapping** — Ink's `wrap="wrap"` doesn't understand double-width CJK characters, causing garbled text; replaced with CJK-aware manual line splitting in chat output and ContextRail sizing so mixed CJK content renders predictably
58
+ - **TUI layout DRY** — sidebar/content width calculation extracted to shared `computeLayoutWidths()` in theme.ts; App.tsx and ChatView.tsx now use the same function, preventing drift
59
+ - **TUI CommandBar overlay** — palette no longer pushes input bar down; rendered as overlay in App.tsx; mouse SGR mode centrally managed to avoid conflicts between palette clicks and chat scrolling
60
+ - **TUI chat freeze under assistant output** — removed assistant Markdown rendering from the workbench chat path and render chat bodies as plain text with CJK-aware wrapping; this avoids heavy reparsing/rerender spikes that could freeze the TUI when the assistant started answering after tool calls
61
+ - **#4** Parallel multi-agent — fully implemented via orchestrator
62
+ - **#52** observations.json perf — migrated to SQLite
63
+ - **#56** LLM rerank timeout — configurable via `MEMORIX_RERANK_TIMEOUT_MS`
64
+ - **#75** Cursor stdio binding — deferred-binding mode instead of exit
65
+ - **Gemini JSON parse** — brace-counting extractor handles trailing text
66
+ - **Evidence for failed tasks** — both fix-exhausted and normal failure paths now write evidence
67
+ - **Agent fallback** — failed agents excluded from retry routing
68
+ - **P1: uninstall hooks** — shared context files (AGENTS.md/GEMINI.md) now block-level removal instead of deleting entire file
69
+ - **P1: budget abort** — current settled dispatch now fails task (was left stuck in_progress)
70
+ - **P1: streaming completion** — waits for stdout/stderr close before resolving (was missing final JSONL lines)
71
+ - **P1: Claude adapter headless hang** — added `--bare` flag to skip hooks/LSP/keychain/interactive ops, plus `--mcp-config` to restore Memorix MCP tool access in bare mode
72
+ - **P1: planner JSON materialization** — use accumulated text from message stream instead of ring buffer `tailOutput` (avoids truncation when planner does many tool calls before outputting plan)
73
+ - **P1: reviewer hanging** — `--mcp-config` enables `memorix_handoff` / `team_task` MCP tool calls that reviewer needs for completion path
74
+ - **P1: structured planner double-create** — `plannerType: 'plan'` tasks now forbidden from calling `team_task create` (must output JSON only; coordinator materializes). Prevents duplicate engineer/reviewer tasks in goal-mode pipelines
75
+ - **P2: budget validation** — CLI and coordinator reject NaN/negative/zero budget values
76
+ - **P2: streaming buffer** — bounded at 1024 messages with drop-oldest policy
77
+ - **P2: install audit** — recordFile called even when Memorix block already exists (audit self-heal on reinstall)
78
+ - **P2: install audit** — new shared file creation also records audit entry
79
+ - **P2: uninstall return** — rules-only agents (codex/gemini-cli) return true when audit cleanup succeeds
80
+ - **#80** OpenCode hooks — plugin now uses individual event-name keys (`session.created`, `file.edited`, `command.executed`, etc.) instead of invalid catch-all `event` handler that OpenCode never called. Replaced fragile `cat | memorix hook` pipe with `Bun.spawn` stdin pipe for reliable cross-platform invocation. Added diagnostic logging on failure. Hooks status now distinguishes verified (config-based) from unverified (plugin-based) agents.
81
+ - **OpenCode plugin v5** — replaced `Bun.spawn` with `child_process.spawnSync` for cross-runtime compatibility (OpenCode may fall back to Node.js on Windows where Bun segfaults). Fixed `file.edited` field extraction (`input.path` before `input.file`). Added exit code and stderr diagnostic logging. Added 10s timeout to prevent hangs.
82
+ - **Copilot Windows runtime** — `powershell` field omitted from hook config when `pwsh` (PowerShell v7+) is not installed, preventing `spawn pwsh.exe ENOENT` errors. Copilot falls back to `bash` field (Git Bash). Install command warns if `pwsh` is missing on Windows and suggests `winget install Microsoft.PowerShell`.
83
+ - **Copilot global hooks** — `getGlobalConfigPath('copilot')` was falling through to the Claude case and returning `~/.claude/settings.json`, which is completely wrong. Per official GitHub docs, Copilot only supports project-level hooks at `.github/hooks/*.json` — there is no global hooks path. Fixed by returning empty string for global path, adding guards in install/uninstall to reject `--global` for Copilot, and updating hooks status to skip the global check.
84
+ - **Hook handler diagnostics** — `runHook()` store path and `handleSessionStart()` now log errors to stderr instead of silently swallowing, making end-to-end pipeline failures visible for debugging.
85
+
86
+ ### Added -- 1.0.7 Closeout
87
+ - **Routing explainability** — `buildRoutingDecision()` / `buildIdleReasons()` helpers trace adapter selection reasons (default_preference, cli_override, quota_fallback, excluded_failed, last_resort) in pipeline trace, evidence, and summary
88
+ - **Structured role extraction** — `extractRole()` prioritizes `metadata.role` over `[Role: ...]` text parsing; canonical source is structured metadata
89
+ - **Balanced scheduling** — `--scheduling balanced` policy with round-robin tiebreaker among equally-preferred adapters; `best-fit` remains default
90
+ - **Idle agent visibility** — pipeline summary includes `idleAgents` with reasons for non-participation
91
+ - **Pipeline summary extensions** — `routingDecisions` and `idleAgents` fields in `PipelineSummary` for full explainability
92
+ - **#62+#74** dashboard loadDotenv
93
+ - **#70** doctor health check
94
+ - **#69** background start non-TTY hang
95
+ - **#66** dashboard delete/cleanup/export
96
+ - **#79** Codex roots/list protocol compatibility
97
+ - **#18** dot-directory merge + hooks install migration
98
+
99
+ ### Removed -- Dead Code (Stabilization)
100
+ - **`src/store/json-store.ts`** — `JsonBackend` class deleted; no runtime or test references. SQLite is sole canonical backend, `DegradedBackend` is read-only fallback.
101
+ - **`appendArchivedObservations` / `loadArchivedObservations`** — dead code removed from `persistence-json.ts` and `persistence.ts` re-exports. Archives live in SQLite `status='archived'` rows.
102
+ - **`'json'` from `getBackendName()` return type** — union narrowed to `'sqlite' | 'degraded'` across `ObservationStore` interface, `SqliteBackend`, `DegradedBackend`.
103
+
104
+ ### Changed -- Stale Naming Cleanup
105
+ - All `JsonBackend` references in comments and test names replaced with `DegradedBackend`.
106
+ - `observations.ts:71` "For JsonBackend" → "For DegradedBackend".
107
+ - `obs-store.ts:91` "JsonBackend: no-op" → "DegradedBackend: no-op".
108
+ - `sqlite-store.test.ts:389` test name "falls back to JsonBackend" → "falls back to DegradedBackend", assertion `['sqlite', 'json']` → `['sqlite', 'degraded']`.
109
+
110
+ ### Fixed -- Dashboard Semantics Closure
111
+ - **Mode/Port semantics** — `DashboardState` now includes `mode` ('standalone' | 'control-plane') and `port`. `/api/project` returns `mode`, `port`, and `mcpEndpoint`. Dashboard UI shows mode banner with i18n support.
112
+ - **Team API contract** — `/api/team` in control-plane mode now normalizes SQLite snake_case rows to camelCase, matching the frontend contract. Added `listAllAgents`, `listAllLocks`, `listAllTasks` to `TeamStore` for global scope.
113
+ - **Team page crash-proof** — `loadTeam()` safely normalizes missing/null fields (`a.id`, `tk.deps`, `l.lockedBy`). No more `Cannot read properties of undefined` errors.
114
+ - **Project switcher sync** — Switching project in the dashboard now calls `/api/set-current-project` to sync backend state.
115
+ - **i18n coverage** — All remaining hardcoded English strings in Team page (time ago, lock TTL, agent time labels, session count) now use `t()` with Chinese translations.
116
+ - **CLI help alignment** — `memorix dashboard` and `memorix serve-http` JSDoc now document mode semantics (Standalone=3210, Control Plane=3211). Startup logs show mode label.
117
+
118
+ ### Changed -- Test Suite Stabilization
119
+ - **E2e demo tests** (`tests/e2e/`) excluded from default `vitest run` — these test CLI-agent demo artifacts, not Memorix product code. Available via `npm run test:e2e`.
120
+ - **Live LLM quality tests** excluded from default suite — require `MEMORIX_RUN_LIVE_LLM_TESTS=1`. Rules-only fallback test preserved in `tests/memory/formation-rules-fallback.test.ts`. Available via `npm run test:llm-live`.
121
+ - **Coordinator merge-conflict test** made deterministic — synchronous conflict file writes in `spawn()` instead of async `setTimeout` race. Removed `{ retry: 3 }`.
122
+ - **Default test suite**: 156 files, 2064 tests, **0 failed**.
123
+
124
+ ### Added -- Hooks Test Coverage
125
+ - Audit ledger lost/corrupted → re-install recovers audit entry (codex).
126
+ - Non-shared-rules agent install/uninstall (claude) verifying config file creation and cleanup.
10
127
 
11
128
  ## [1.0.6] - 2026-04-05
12
129
 
13
- ### Added Memory Provenance and Layered Retrieval
14
- - **Provenance foundation** Observations now carry `sourceDetail` (`explicit` / `hook` / `git-ingest`) and `valueCategory` (`core` / `contextual` / `ephemeral`). All ten write-path call sites annotated. Backward-compatible: old data without new fields parses cleanly.
15
- - **Layered disclosure (L1/L2/L3)** `memorix_session_start` now separates routing hints (L1), working context (L2), and deep evidence (L3). Session injection scores observations by source and value category so hook noise stays out of working context.
16
- - **Evidence retrieval** `memorix_detail` and `memorix_timeline` now surface provenance cues (source badge, evidence basis) so operators can trace why a memory exists and what supports it.
17
- - **Verification-aware evidence** Detail and timeline outputs distinguish direct, summarized, derived, and repository-backed evidence without requiring a full citation framework.
18
- - **Citation-lite** Evidence-bearing surfaces emit lightweight citation hints (`[source: git]`, `[verified: repo-backed]`) to support "why surfaced" and "what supports this" queries.
19
- - **Retrieval tuning** Source-aware boost treats `git-ingest` as first-class git evidence for intent-aware ranking. Lightweight provenance tiebreaking for ambiguous retrieval results. L1 routing surfaces active entities as next-hop search guidance.
20
- - **Graph routing hints** Knowledge graph neighborhood is used for lightweight retrieval enrichment and entity-affinity scoring without a full graph rewrite.
130
+ ### Added -- Memory Provenance and Layered Retrieval
131
+ - **Provenance foundation** -- Observations now carry `sourceDetail` (`explicit` / `hook` / `git-ingest`) and `valueCategory` (`core` / `contextual` / `ephemeral`). All ten write-path call sites annotated. Backward-compatible: old data without new fields parses cleanly.
132
+ - **Layered disclosure (L1/L2/L3)** -- `memorix_session_start` now separates routing hints (L1), working context (L2), and deep evidence (L3). Session injection scores observations by source and value category so hook noise stays out of working context.
133
+ - **Evidence retrieval** -- `memorix_detail` and `memorix_timeline` now surface provenance cues (source badge, evidence basis) so operators can trace why a memory exists and what supports it.
134
+ - **Verification-aware evidence** -- Detail and timeline outputs distinguish direct, summarized, derived, and repository-backed evidence without requiring a full citation framework.
135
+ - **Citation-lite** -- Evidence-bearing surfaces emit lightweight citation hints (`[source: git]`, `[verified: repo-backed]`) to support "why surfaced" and "what supports this" queries.
136
+ - **Retrieval tuning** -- Source-aware boost treats `git-ingest` as first-class git evidence for intent-aware ranking. Lightweight provenance tiebreaking for ambiguous retrieval results. L1 routing surfaces active entities as next-hop search guidance.
137
+ - **Graph routing hints** -- Knowledge graph neighborhood is used for lightweight retrieval enrichment and entity-affinity scoring without a full graph rewrite.
21
138
 
22
- ### Added Task-Line Scoping, Secret Safety, and Attribution Hardening
23
- - **Task-line scoping** Search and session context now bias toward the current entity/task-line/subdomain, reducing cross-workstream contamination within a single project bucket.
24
- - **Secret safety** Store-time detection blocks obvious credentials, passwords, and tokens from entering durable memory. Retrieval-time redaction acts as a second safety net for already-stored sensitive data.
25
- - **Project attribution hardening** Write-path consistency checks reduce wrong-bucket writes. `memorix_audit_project` scans for misattributed observations and reports them with confidence levels.
26
- - **Ambiguous-target attribution fix** Observations stored during ambiguous project context are now flagged rather than silently written to the wrong bucket.
139
+ ### Added -- Task-Line Scoping, Secret Safety, and Attribution Hardening
140
+ - **Task-line scoping** -- Search and session context now bias toward the current entity/task-line/subdomain, reducing cross-workstream contamination within a single project bucket.
141
+ - **Secret safety** -- Store-time detection blocks obvious credentials, passwords, and tokens from entering durable memory. Retrieval-time redaction acts as a second safety net for already-stored sensitive data.
142
+ - **Project attribution hardening** -- Write-path consistency checks reduce wrong-bucket writes. `memorix_audit_project` scans for misattributed observations and reports them with confidence levels.
143
+ - **Ambiguous-target attribution fix** -- Observations stored during ambiguous project context are now flagged rather than silently written to the wrong bucket.
27
144
 
28
- ### Added Retention, Cleanup, and Operator Remediation
29
- - **Retention calibration** Source-aware retention multipliers (hook 0.5×, git-ingest 1.) and value-category multipliers (ephemeral 0.5×, core 2.) with a 7-day minimum floor. Immunity refined: only `critical` importance and `core` valueCategory grant permanent immunity; `high`-importance types keep long retention but can now decay.
30
- - **Retention explainability** `memorix_retention action="stale"` shows a full table with per-observation retention explanation (importance, multipliers, effective days, zone, immunity reason).
31
- - **Cleanup remediation loop** `memorix_retention` (stale/report), `memorix_audit_project`, and `memorix_resolve` now form a coherent operator loop. Each output includes structured `Suggested IDs: [...]` blocks and explicit next-step guidance. `memorix_resolve` links back to retention report for closed-loop cleanup.
145
+ ### Added -- Retention, Cleanup, and Operator Remediation
146
+ - **Retention calibration** -- Source-aware retention multipliers (hook 0.5x, git-ingest 1.5x) and value-category multipliers (ephemeral 0.5x, core 2.0x) with a 7-day minimum floor. Immunity refined: only `critical` importance and `core` valueCategory grant permanent immunity; `high`-importance types keep long retention but can now decay.
147
+ - **Retention explainability** -- `memorix_retention action="stale"` shows a full table with per-observation retention explanation (importance, multipliers, effective days, zone, immunity reason).
148
+ - **Cleanup remediation loop** -- `memorix_retention` (stale/report), `memorix_audit_project`, and `memorix_resolve` now form a coherent operator loop. Each output includes structured `Suggested IDs: [...]` blocks and explicit next-step guidance. `memorix_resolve` links back to retention report for closed-loop cleanup.
32
149
 
33
- ### Added OpenCode Plugin Improvements
34
- - **`post_compact` event** New `post_compact` hook event type. OpenCode's `session.compacted` event correctly maps to `post_compact` (was incorrectly mapped to `pre_compact`). Plugin event handler triggers `runHook` side-effect on compaction completion.
35
- - **Structured compaction prompt** OpenCode compaction prompt rewritten as a structured continuation format requesting current task, key decisions, active files, blockers, next steps, active entities, and memorix context. No longer promises automatic `memorix_store` / `memorix_session_start` invocation during compaction.
150
+ ### Added -- OpenCode Plugin Improvements
151
+ - **`post_compact` event** -- New `post_compact` hook event type. OpenCode's `session.compacted` event correctly maps to `post_compact` (was incorrectly mapped to `pre_compact`). Plugin event handler triggers `runHook` side-effect on compaction completion.
152
+ - **Structured compaction prompt** -- OpenCode compaction prompt rewritten as a structured continuation format requesting current task, key decisions, active files, blockers, next steps, active entities, and memorix context. No longer promises automatic `memorix_store` / `memorix_session_start` invocation during compaction.
36
153
 
37
154
  ### Fixed
38
- - **#45 OpenCode compaction** Compaction prompt no longer makes misleading tool-call promises. `session.compacted` event now fires a real side-effect via `runHook`. Normalizer mapping corrected to `post_compact`.
39
- - **#46 Dotenv load order** `loadDotenv()` now runs before `getEmbeddingProvider()` in `status`, `doctor`, and TUI entry points, fixing "No API key" errors when `.env` credentials were present.
40
- - **#48 Ingest log dedup** `memorix ingest log` now deduplicates by commit hash, matching the behavior of `ingest commit` and TUI batch ingest. Repeated runs skip already-ingested commits.
155
+ - **#45 OpenCode compaction** -- Compaction prompt no longer makes misleading tool-call promises. `session.compacted` event now fires a real side-effect via `runHook`. Normalizer mapping corrected to `post_compact`.
156
+ - **#46 Dotenv load order** -- `loadDotenv()` now runs before `getEmbeddingProvider()` in `status`, `doctor`, and TUI entry points, fixing "No API key" errors when `.env` credentials were present.
157
+ - **#48 Ingest log dedup** -- `memorix ingest log` now deduplicates by commit hash, matching the behavior of `ingest commit` and TUI batch ingest. Repeated runs skip already-ingested commits.
41
158
 
42
159
  ### Stats
43
160
  - **Tests:** 1439 passed | 2 skipped (102 files)
44
- - **Phases landed:** 11 (provenance layered disclosure evidence verification citation-lite retrieval tuning graph routing task-line/secret attribution retention cleanup ergonomics)
161
+ - **Phases landed:** 11 (provenance -> layered disclosure -> evidence -> verification -> citation-lite -> retrieval tuning -> graph routing -> task-line/secret -> attribution -> retention -> cleanup ergonomics)
45
162
 
46
163
  ---
47
164
 
@@ -77,29 +194,29 @@ All notable changes to this project will be documented in this file.
77
194
 
78
195
  ---
79
196
 
80
- ## [1.0.4] 2026-03-17
197
+ ## [1.0.4] -- 2026-03-17
81
198
 
82
199
  ### Added
83
- - **Git Memory pipeline** `git commit` can now flow directly into Memorix via `memorix git-hook`, `memorix git-hook-uninstall`, and `memorix ingest commit --auto`. Stored observations now carry `source` and `commitHash`, and Git memories can be filtered explicitly with `source: "git"`.
84
- - **Reasoning Memory tools** Added `memorix_store_reasoning` and `memorix_search_reasoning` so design rationale, alternatives, constraints, and risks can be stored and searched as a first-class memory layer.
85
- - **Source-aware retrieval and cross-linking** Search now boosts Git, reasoning, and problem-solution memories differently based on query intent. Git memories and reasoning memories can cross-reference each other via related commits and shared entities.
86
- - **Structured config model** Added project/user `memorix.yml`, project/user `.env` loading, `memorix init`, and configuration provenance diagnostics in `memorix status`.
87
- - **Dashboard control plane upgrades** Added Git Memory, Config Provenance, and Identity Health views, plus richer stats and a stabilized graph layout for the HTTP dashboard.
200
+ - **Git Memory pipeline** -- `git commit` can now flow directly into Memorix via `memorix git-hook`, `memorix git-hook-uninstall`, and `memorix ingest commit --auto`. Stored observations now carry `source` and `commitHash`, and Git memories can be filtered explicitly with `source: "git"`.
201
+ - **Reasoning Memory tools** -- Added `memorix_store_reasoning` and `memorix_search_reasoning` so design rationale, alternatives, constraints, and risks can be stored and searched as a first-class memory layer.
202
+ - **Source-aware retrieval and cross-linking** -- Search now boosts Git, reasoning, and problem-solution memories differently based on query intent. Git memories and reasoning memories can cross-reference each other via related commits and shared entities.
203
+ - **Structured config model** -- Added project/user `memorix.yml`, project/user `.env` loading, `memorix init`, and configuration provenance diagnostics in `memorix status`.
204
+ - **Dashboard control plane upgrades** -- Added Git Memory, Config Provenance, and Identity Health views, plus richer stats and a stabilized graph layout for the HTTP dashboard.
88
205
 
89
206
  ### Changed
90
- - **Documentation consolidation** Reworked README, README.zh-CN, setup, architecture, API reference, configuration, Git Memory, and development guides so they match the current product model: local-first platform, `memorix.yml + .env`, Git Memory, HTTP dashboard, and the four-layer architecture.
91
- - **Project detection model** Project identity now centers on real Git roots, MCP roots support, system-directory fallback handling, and runtime project switching instead of older placeholder-style fallback identities.
92
- - **Dashboard usage model** `memorix background start` is now the primary long-lived HTTP control-plane entrypoint when you want HTTP transport, collaboration features, and dashboard access in one place. `memorix serve-http --port 3211` remains the foreground/debug variant.
207
+ - **Documentation consolidation** -- Reworked README, README.zh-CN, setup, architecture, API reference, configuration, Git Memory, and development guides so they match the current product model: local-first platform, `memorix.yml + .env`, Git Memory, HTTP dashboard, and the four-layer architecture.
208
+ - **Project detection model** -- Project identity now centers on real Git roots, MCP roots support, system-directory fallback handling, and runtime project switching instead of older placeholder-style fallback identities.
209
+ - **Dashboard usage model** -- `memorix background start` is now the primary long-lived HTTP control-plane entrypoint when you want HTTP transport, collaboration features, and dashboard access in one place. `memorix serve-http --port 3211` remains the foreground/debug variant.
93
210
 
94
211
  ### Fixed
95
- - **Project identity drift** Fixed Codex/Windsurf startup issues that produced `local/System32`, IDE-installation-directory identities, or other incorrect local project bindings.
96
- - **Worktree-safe Git hooks** Hook installation, uninstall, auto-install checks, and status reporting now resolve hooks directories correctly for both normal repos and Git worktrees.
97
- - **Runtime config correctness** Fixed project-level `memorix.yml` not reaching runtime getters, `.env` values leaking across project switches, and legacy `config.json` not showing up correctly in provenance diagnostics.
98
- - **Git Memory quality** Added noise filtering, preserved release/version milestone commits, and implemented `memorix ingest commit --force` as an escape hatch for manual ingestion.
99
- - **Cross-project detail retrieval** Global search results can now be opened reliably with project-aware refs instead of colliding on observation IDs from different projects.
100
- - **Skill generation noise** `memorix_skills generate` now filters low-signal command-history observations like `git`, `gh`, `npm`, and `npx` so generated skills stay project-relevant.
101
- - **OpenCode static plugin noise** Merged the first external PR to silence `console.log` spam in the static OpenCode plugin without reintroducing session lifecycle side effects.
102
- - **CI/publish flow** Restored CI green after type/test regressions and changed npm publishing workflow to manual trigger instead of automatic release publishing.
212
+ - **Project identity drift** -- Fixed Codex/Windsurf startup issues that produced `local/System32`, IDE-installation-directory identities, or other incorrect local project bindings.
213
+ - **Worktree-safe Git hooks** -- Hook installation, uninstall, auto-install checks, and status reporting now resolve hooks directories correctly for both normal repos and Git worktrees.
214
+ - **Runtime config correctness** -- Fixed project-level `memorix.yml` not reaching runtime getters, `.env` values leaking across project switches, and legacy `config.json` not showing up correctly in provenance diagnostics.
215
+ - **Git Memory quality** -- Added noise filtering, preserved release/version milestone commits, and implemented `memorix ingest commit --force` as an escape hatch for manual ingestion.
216
+ - **Cross-project detail retrieval** -- Global search results can now be opened reliably with project-aware refs instead of colliding on observation IDs from different projects.
217
+ - **Skill generation noise** -- `memorix_skills generate` now filters low-signal command-history observations like `git`, `gh`, `npm`, and `npx` so generated skills stay project-relevant.
218
+ - **OpenCode static plugin noise** -- Merged the first external PR to silence `console.log` spam in the static OpenCode plugin without reintroducing session lifecycle side effects.
219
+ - **CI/publish flow** -- Restored CI green after type/test regressions and changed npm publishing workflow to manual trigger instead of automatic release publishing.
103
220
 
104
221
  ### Stats
105
222
  - **Tests:** 879/879 passing across 68 files
@@ -107,14 +224,14 @@ All notable changes to this project will be documented in this file.
107
224
 
108
225
  ---
109
226
 
110
- ## [1.0.3] 2026-03-14
227
+ ## [1.0.3] -- 2026-03-14
111
228
 
112
229
  ### Added
113
- - **Memory Formation Pipeline** Three-stage pipeline (Extract Resolve Evaluate) runs in shadow mode on every `memorix_store` call and hooks trigger. Collects quality metrics without affecting storage decisions.
230
+ - **Memory Formation Pipeline** -- Three-stage pipeline (Extract -> Resolve -> Evaluate) runs in shadow mode on every `memorix_store` call and hooks trigger. Collects quality metrics without affecting storage decisions.
114
231
  - **Extract**: Automatic fact extraction from narratives, title normalization, entity resolution against Knowledge Graph, observation type verification.
115
232
  - **Resolve**: 4 resolution actions (new/merge/evolve/discard) based on similarity scoring, word overlap, and contradiction detection.
116
233
  - **Evaluate**: Multi-factor knowledge value assessment (type weight, fact density, specificity, causal reasoning, noise detection). Categorizes memories as core/contextual/ephemeral.
117
- - **`memorix_formation_metrics` tool** New MCP tool to query aggregated Formation Pipeline metrics (value scores, resolution actions, extraction rates, processing times).
234
+ - **`memorix_formation_metrics` tool** -- New MCP tool to query aggregated Formation Pipeline metrics (value scores, resolution actions, extraction rates, processing times).
118
235
  - **`getEntityNames()` method** on `KnowledgeGraphManager` for Formation Pipeline entity resolution.
119
236
 
120
237
  ### Stats
@@ -124,56 +241,56 @@ All notable changes to this project will be documented in this file.
124
241
 
125
242
  ---
126
243
 
127
- ## [1.0.2] 2026-03-14
244
+ ## [1.0.2] -- 2026-03-14
128
245
 
129
246
  ### Fixed
130
- - **MCP Server version mismatch** Server now reports the correct version from `package.json` (was hardcoded `0.1.0`). Injected at build time via tsup `define`.
131
- - **CI Node.js matrix** Removed Node 18 from CI matrix to match `engines: >=20` in `package.json`.
132
- - **Orama reindex idempotency** `reindexObservations()` now resets the Orama DB before rebuilding, eliminating "document already exists" errors in multi-session scenarios.
133
- - **E2E tests no longer touch real user data** Mini-skills E2E tests now use a temporary directory with synthetic observations instead of reading/writing `~/.memorix/data/`.
247
+ - **MCP Server version mismatch** -- Server now reports the correct version from `package.json` (was hardcoded `0.1.0`). Injected at build time via tsup `define`.
248
+ - **CI Node.js matrix** -- Removed Node 18 from CI matrix to match `engines: >=20` in `package.json`.
249
+ - **Orama reindex idempotency** -- `reindexObservations()` now resets the Orama DB before rebuilding, eliminating "document already exists" errors in multi-session scenarios.
250
+ - **E2E tests no longer touch real user data** -- Mini-skills E2E tests now use a temporary directory with synthetic observations instead of reading/writing `~/.memorix/data/`.
134
251
 
135
252
  ---
136
253
 
137
- ## [1.0.1] 2026-03-14
254
+ ## [1.0.1] -- 2026-03-14
138
255
 
139
256
  ### Fixed
140
- - **OpenCode stdout pollution** Removed all `console.log` / `console.error` from the generated OpenCode plugin template. Hooks now run fully silent. (fixes #15)
141
- - **OpenCode session_id missing** `normalizeOpenCode()` now reads `session_id` from the payload instead of hardcoding empty string. Plugin template generates and injects a stable session ID per plugin lifetime. (fixes #14)
142
- - **Auto-install hooks scope** Hooks are now only auto-installed for IDEs whose project-level config directory already exists (e.g., `.cursor/`, `.windsurf/`), preventing unwanted IDE directories from appearing in projects opened with a different IDE.
257
+ - **OpenCode stdout pollution** -- Removed all `console.log` / `console.error` from the generated OpenCode plugin template. Hooks now run fully silent. (fixes #15)
258
+ - **OpenCode session_id missing** -- `normalizeOpenCode()` now reads `session_id` from the payload instead of hardcoding empty string. Plugin template generates and injects a stable session ID per plugin lifetime. (fixes #14)
259
+ - **Auto-install hooks scope** -- Hooks are now only auto-installed for IDEs whose project-level config directory already exists (e.g., `.cursor/`, `.windsurf/`), preventing unwanted IDE directories from appearing in projects opened with a different IDE.
143
260
 
144
261
  ### Added
145
- - **`MEMORIX_DATA_DIR` environment variable** Override the default data directory (`~/.memorix/data/`) by setting `MEMORIX_DATA_DIR`. Applied consistently across persistence, alias registry, and embedding cache.
262
+ - **`MEMORIX_DATA_DIR` environment variable** -- Override the default data directory (`~/.memorix/data/`) by setting `MEMORIX_DATA_DIR`. Applied consistently across persistence, alias registry, and embedding cache.
146
263
 
147
264
  ---
148
265
 
149
- ## [1.0.0] 2026-03-09
266
+ ## [1.0.0] -- 2026-03-09
150
267
 
151
268
  ### 🎉 First Stable Release
152
269
 
153
- Memorix reaches v1.0.0 all major features complete. Future versions will iterate based on AI/agent ecosystem evolution.
270
+ Memorix reaches v1.0.0 -- all major features complete. Future versions will iterate based on AI/agent ecosystem evolution.
154
271
 
155
272
  ### Added
156
- - **Multi-Agent Team Collaboration** 4 team tools (`team_manage`, `team_file_lock`, `team_task`, `team_message`) for cross-IDE agent coordination. File-based persistence via `team-state.json`. Verified: Windsurf Antigravity bidirectional communication.
157
- - **Auto-Cleanup on Startup** Background retention archiving and intelligent deduplication run automatically in `deferredInit`. With LLM configured: semantic dedup via any OpenAI-compatible model. Without LLM: Jaccard similarity consolidation. Zero manual maintenance required.
158
- - **`memorix_transfer` tool** Merged `memorix_export` + `memorix_import` into a single tool with `action: "export" | "import"`.
159
- - **TEAM.md** Multi-agent coordination protocol documentation.
273
+ - **Multi-Agent Team Collaboration** -- 4 team tools (`team_manage`, `team_file_lock`, `team_task`, `team_message`) for cross-IDE agent coordination. File-based persistence via `team-state.json`. Verified: Windsurf <-> Antigravity bidirectional communication.
274
+ - **Auto-Cleanup on Startup** -- Background retention archiving and intelligent deduplication run automatically in `deferredInit`. With LLM configured: semantic dedup via any OpenAI-compatible model. Without LLM: Jaccard similarity consolidation. Zero manual maintenance required.
275
+ - **`memorix_transfer` tool** -- Merged `memorix_export` + `memorix_import` into a single tool with `action: "export" | "import"`.
276
+ - **TEAM.md** -- Multi-agent coordination protocol documentation.
160
277
 
161
278
  ### Changed
162
- - **Tool consolidation: 41 22 default tools (-46%)**
163
- - Team tools: 13 individual 4 merged (action parameter pattern)
164
- - Knowledge Graph tools: 9 conditional via `~/.memorix/settings.json` (`{ "knowledgeGraph": true }`)
165
- - Export+Import: 2 1 (`memorix_transfer`)
166
- - **Dashboard Team Panel** Redesigned with Iconify icons, Material Design 3 style. Agent cards, task lists, message panel, file lock panel.
279
+ - **Tool consolidation: 41 -> 22 default tools (-46%)**
280
+ - Team tools: 13 individual -> 4 merged (action parameter pattern)
281
+ - Knowledge Graph tools: 9 -> conditional via `~/.memorix/settings.json` (`{ "knowledgeGraph": true }`)
282
+ - Export+Import: 2 -> 1 (`memorix_transfer`)
283
+ - **Dashboard Team Panel** -- Redesigned with Iconify icons, Material Design 3 style. Agent cards, task lists, message panel, file lock panel.
167
284
  - **README updated** for v1.0.0 stable (EN + 中文).
168
285
 
169
286
  ### Fixed
170
- - **Windows EPERM file lock race condition** Treat EPERM same as EEXIST in file-lock.ts.
171
- - **PowerShell BOM in config.json** `Set-Content -Encoding UTF8` adds BOM in PS 5.x, breaking `JSON.parse`. Always use Node.js for config file writes.
287
+ - **Windows EPERM file lock race condition** -- Treat EPERM same as EEXIST in file-lock.ts.
288
+ - **PowerShell BOM in config.json** -- `Set-Content -Encoding UTF8` adds BOM in PS 5.x, breaking `JSON.parse`. Always use Node.js for config file writes.
172
289
 
173
290
  ### Production Hardening
174
291
  - Cross-session shared team state
175
292
  - Inbox capped at 200 messages with auto-eviction
176
- - Session timeout GC (30min idle auto-close)
293
+ - Session timeout GC (30min idle -> auto-close)
177
294
  - Send to inactive agent rejected
178
295
  - Agent leave releases file locks + clears inbox
179
296
  - Orphaned task rescue when assignee inactive
@@ -184,317 +301,317 @@ Memorix reaches v1.0.0 — all major features complete. Future versions will ite
184
301
  - **Tests:** 753/753 passing across 56 files
185
302
  - **IDE Support:** 10 agents (Cursor, Windsurf, Claude Code, Codex, Copilot, Kiro, Antigravity, OpenCode, Trae, Gemini CLI)
186
303
 
187
- ## [0.12.0] 2026-03-08
304
+ ## [0.12.0] -- 2026-03-08
188
305
 
189
306
  ### Added
190
- - **Intent-Aware Recall** Search understands query intent ("why X?" prioritizes decisions/trade-offs, "how to X?" prioritizes how-it-works).
191
- - **MCP Deadlock Fix** Resolved stdio transport deadlock under high concurrency.
192
- - **Dashboard Dark Theme Fix** Proper dark mode support across all panels.
193
- - **Build Race Condition Fix** Fixed tsup parallel build race condition.
307
+ - **Intent-Aware Recall** -- Search understands query intent ("why X?" prioritizes decisions/trade-offs, "how to X?" prioritizes how-it-works).
308
+ - **MCP Deadlock Fix** -- Resolved stdio transport deadlock under high concurrency.
309
+ - **Dashboard Dark Theme Fix** -- Proper dark mode support across all panels.
310
+ - **Build Race Condition Fix** -- Fixed tsup parallel build race condition.
194
311
 
195
- ## [0.11.0] 2026-03-07
312
+ ## [0.11.0] -- 2026-03-07
196
313
 
197
314
  ### Added
198
- - **Mini-Skills** (`memorix_promote`) Promote observations to permanent skills that auto-inject at session start. Never decay, project-scoped.
199
- - **LLM Quality Engine** Compact-on-write (duplicate detection at write time), narrative compression (~27% token reduction), search reranking (60% queries improved).
200
- - **`memorix_deduplicate` tool** LLM-powered semantic deduplication with dry-run support.
201
- - **`memorix_resolve` tool** Mark completed tasks and fixed bugs as resolved to prevent context pollution.
315
+ - **Mini-Skills** (`memorix_promote`) -- Promote observations to permanent skills that auto-inject at session start. Never decay, project-scoped.
316
+ - **LLM Quality Engine** -- Compact-on-write (duplicate detection at write time), narrative compression (~27% token reduction), search reranking (60% queries improved).
317
+ - **`memorix_deduplicate` tool** -- LLM-powered semantic deduplication with dry-run support.
318
+ - **`memorix_resolve` tool** -- Mark completed tasks and fixed bugs as resolved to prevent context pollution.
202
319
 
203
320
  ### Fixed
204
- - **Retention decay fix** Reclassified `what-changed`/`discovery` to low retention (30d instead of 90d).
321
+ - **Retention decay fix** -- Reclassified `what-changed`/`discovery` to low retention (30d instead of 90d).
205
322
 
206
323
  ### Stats
207
- - **Tests:** 641 674 passing
324
+ - **Tests:** 641 -> 674 passing
208
325
 
209
- ## [0.10.6] 2026-03-06
326
+ ## [0.10.6] -- 2026-03-06
210
327
 
211
328
  ### Fixed
212
329
  - Minor stability improvements.
213
330
 
214
- ## [0.10.5] 2026-03-05
331
+ ## [0.10.5] -- 2026-03-05
215
332
 
216
333
  ### Fixed
217
- - **🔴 Critical: Antigravity MCP connection failure** CLI banner (starting with 🧠 emoji, UTF-8 `F0 9F A7 A0`) was written to `stdout` via `console.log` in the non-interactive branch. When `citty` dispatches to `serve` subcommand, it calls parent `run()` first, polluting the MCP JSON-RPC stream. Go's `encoding/json` in Antigravity failed on the first byte `0xF0` with `invalid character 'ð'`. Fix: `console.log` `console.error` for all CLI banner output.
218
- - **🔴 Critical: Claude Code Stop hook schema validation failure** `hookSpecificOutput` was returned for all hook events, but Claude Code only supports it for `PreToolUse`, `UserPromptSubmit`, and `PostToolUse`. Events like `SessionStart`, `Stop`, and `PreCompact` with `hookSpecificOutput` triggered `JSON validation failed: Invalid input`. Fix: only include `hookSpecificOutput` for the 3 supported event types.
219
- - **Claude Code hook_event_name not read** Handler read `payload.hookEventName` (camelCase) but Claude Code sends `hook_event_name` (snake_case), causing `hookEventName` to always be empty and `hookSpecificOutput` to be `{}`.
220
- - **Windows hook stdin piping broken** `cmd /c memorix hook` wrapper broke stdin piping for hook event JSON. Changed to `memorix.cmd hook` which directly invokes the CMD shim and properly forwards stdin.
221
- - **CLI emoji removed** All emoji in CLI output replaced with plain text markers (`[OK]`, `[FAIL]`, `[WARN]`, `[SKIP]`, `[DRY RUN]`) for enterprise-grade compatibility and to prevent future UTF-8 encoding issues.
334
+ - **🔴 Critical: Antigravity MCP connection failure** -- CLI banner (starting with 🧠 emoji, UTF-8 `F0 9F A7 A0`) was written to `stdout` via `console.log` in the non-interactive branch. When `citty` dispatches to `serve` subcommand, it calls parent `run()` first, polluting the MCP JSON-RPC stream. Go's `encoding/json` in Antigravity failed on the first byte `0xF0` with `invalid character 'ð'`. Fix: `console.log` -> `console.error` for all CLI banner output.
335
+ - **🔴 Critical: Claude Code Stop hook schema validation failure** -- `hookSpecificOutput` was returned for all hook events, but Claude Code only supports it for `PreToolUse`, `UserPromptSubmit`, and `PostToolUse`. Events like `SessionStart`, `Stop`, and `PreCompact` with `hookSpecificOutput` triggered `JSON validation failed: Invalid input`. Fix: only include `hookSpecificOutput` for the 3 supported event types.
336
+ - **Claude Code hook_event_name not read** -- Handler read `payload.hookEventName` (camelCase) but Claude Code sends `hook_event_name` (snake_case), causing `hookEventName` to always be empty and `hookSpecificOutput` to be `{}`.
337
+ - **Windows hook stdin piping broken** -- `cmd /c memorix hook` wrapper broke stdin piping for hook event JSON. Changed to `memorix.cmd hook` which directly invokes the CMD shim and properly forwards stdin.
338
+ - **CLI emoji removed** -- All emoji in CLI output replaced with plain text markers (`[OK]`, `[FAIL]`, `[WARN]`, `[SKIP]`, `[DRY RUN]`) for enterprise-grade compatibility and to prevent future UTF-8 encoding issues.
222
339
 
223
- ## [0.9.25] 2026-02-28
340
+ ## [0.9.25] -- 2026-02-28
224
341
 
225
342
  ### Fixed
226
- - **Windsurf "no tools returned"** Transport-first architecture caused Windsurf to query `tools/list` before tools were registered. Normal path now registers tools first, then connects transport. Roots path (invalid cwd) still connects first to query `listRoots`.
227
- - **Windsurf rules not activated** Generated `.windsurf/rules/memorix.md` lacked YAML frontmatter (`trigger: always_on`). Windsurf ignored the file without it. Also added `alwaysApply: true` frontmatter for Cursor `.mdc` files.
228
- - **Windsurf hook `post_command` content too short** Normalizer didn't extract `commandOutput` from Windsurf `post_command` events, causing content to be <30 chars and filtered out.
229
- - **Hook hot-reload broken on Windows** `fs.watch()` lost track of `observations.json` after `atomicWriteFile` (which uses `rename()`). Switched to `fs.watchFile` with 2s polling for reliable cross-platform hot-reload. Hook-written memories are now searchable within ~4 seconds.
343
+ - **Windsurf "no tools returned"** -- Transport-first architecture caused Windsurf to query `tools/list` before tools were registered. Normal path now registers tools first, then connects transport. Roots path (invalid cwd) still connects first to query `listRoots`.
344
+ - **Windsurf rules not activated** -- Generated `.windsurf/rules/memorix.md` lacked YAML frontmatter (`trigger: always_on`). Windsurf ignored the file without it. Also added `alwaysApply: true` frontmatter for Cursor `.mdc` files.
345
+ - **Windsurf hook `post_command` content too short** -- Normalizer didn't extract `commandOutput` from Windsurf `post_command` events, causing content to be <30 chars and filtered out.
346
+ - **Hook hot-reload broken on Windows** -- `fs.watch()` lost track of `observations.json` after `atomicWriteFile` (which uses `rename()`). Switched to `fs.watchFile` with 2s polling for reliable cross-platform hot-reload. Hook-written memories are now searchable within ~4 seconds.
230
347
 
231
- ## [0.9.18] 2026-02-26
348
+ ## [0.9.18] -- 2026-02-26
232
349
 
233
350
  ### Fixed
234
- - **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 alongside `memorix_internal` tools.
351
+ - **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 alongside `memorix_internal` tools.
235
352
 
236
- ## [0.9.17] 2026-02-26
353
+ ## [0.9.17] -- 2026-02-26
237
354
 
238
355
  ### Fixed
239
- - **Session activity noise** Empty `session_end` events 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.
356
+ - **Session activity noise** -- Empty `session_end` events 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.
240
357
 
241
- ## [0.9.16] 2026-02-26
358
+ ## [0.9.16] -- 2026-02-26
242
359
 
243
360
  ### Architecture
244
- - **Classify Policy Store pipeline** Replaced the monolithic `switch/case` handler (527 lines) with a clean declarative pipeline (432 lines). Inspired by claude-mem's store-first philosophy and mcp-memory-service's configurable scoring.
245
- - **Tool Taxonomy** `classifyTool()` categorizes tools into `file_modify | file_read | command | search | memorix_internal | unknown`. Each category has a declarative `StoragePolicy` (store mode, minLength, defaultType).
246
- - **Pattern detection = classification only** Pattern detection now only determines observation *type* (decision, error, etc.), not whether to store. Storage decisions are made by policy.
247
- - **Unified `TYPE_EMOJI`** Single exported constant, eliminating 3 duplicated copies across handler and session_start.
361
+ - **Classify -> Policy -> Store pipeline** -- Replaced the monolithic `switch/case` handler (527 lines) with a clean declarative pipeline (432 lines). Inspired by claude-mem's store-first philosophy and mcp-memory-service's configurable scoring.
362
+ - **Tool Taxonomy** -- `classifyTool()` categorizes tools into `file_modify | file_read | command | search | memorix_internal | unknown`. Each category has a declarative `StoragePolicy` (store mode, minLength, defaultType).
363
+ - **Pattern detection = classification only** -- Pattern detection now only determines observation *type* (decision, error, etc.), not whether to store. Storage decisions are made by policy.
364
+ - **Unified `TYPE_EMOJI`** -- Single exported constant, eliminating 3 duplicated copies across handler and session_start.
248
365
 
249
366
  ### Fixed
250
- - **🔴 Critical: Bash commands with `cd` prefix silently dropped** Claude Code sends Bash commands as `cd /project && npm test 2>&1`. The noise filter `/^cd\b/` matched the `cd` prefix and silently discarded the entire command. This caused `npm test`, `npm install express`, `node -e "..."`, and all other project-scoped commands to never be stored. Fix: `extractRealCommand()` strips `cd path && ` prefix before noise checking, so `cd /path && npm test` is correctly evaluated as `npm test`.
251
- - **Cooldown key too broad** Old key `post_tool:Bash` meant ALL Bash commands shared one 30-second cooldown. New key uses `event:filePath|command|toolName`, so `npm test` and `npm install` have independent cooldowns.
252
- - **Store-first for commands** Command-category tools now use `store: 'always'` policy with minLength 30 (down from 50-200), capturing more meaningful development activity.
367
+ - **🔴 Critical: Bash commands with `cd` prefix silently dropped** -- Claude Code sends Bash commands as `cd /project && npm test 2>&1`. The noise filter `/^cd\b/` matched the `cd` prefix and silently discarded the entire command. This caused `npm test`, `npm install express`, `node -e "..."`, and all other project-scoped commands to never be stored. Fix: `extractRealCommand()` strips `cd path && ` prefix before noise checking, so `cd /path && npm test` is correctly evaluated as `npm test`.
368
+ - **Cooldown key too broad** -- Old key `post_tool:Bash` meant ALL Bash commands shared one 30-second cooldown. New key uses `event:filePath|command|toolName`, so `npm test` and `npm install` have independent cooldowns.
369
+ - **Store-first for commands** -- Command-category tools now use `store: 'always'` policy with minLength 30 (down from 50-200), capturing more meaningful development activity.
253
370
 
254
- ## [0.9.15] 2026-02-26
371
+ ## [0.9.15] -- 2026-02-26
255
372
 
256
373
  ### Fixed
257
- - **Feedback visibility** Hook auto-stores were silent. Now returns `systemMessage` to the agent after each save, e.g. `🟢 Memorix saved: Updated auth.ts [what-changed]`. Gives Codex-like visibility into what memorix is recording.
258
- - **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-changed` by default.
259
- - **PreCompact low-quality spam** PreCompact events stored empty/minimal observations with no meaningful content. Now requires `MIN_STORE_LENGTH` (100 chars) to store.
260
- - **Normalizer prompt extraction** `normalizeClaude` only extracted `prompt` for `user_prompt` events. Now extracts for all events (PreCompact, etc.), preserving context that would otherwise be lost.
374
+ - **Feedback visibility** -- Hook auto-stores were silent. Now returns `systemMessage` to the agent after each save, e.g. `🟢 Memorix saved: Updated auth.ts [what-changed]`. Gives Codex-like visibility into what memorix is recording.
375
+ - **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-changed` by default.
376
+ - **PreCompact low-quality spam** -- PreCompact events stored empty/minimal observations with no meaningful content. Now requires `MIN_STORE_LENGTH` (100 chars) to store.
377
+ - **Normalizer prompt extraction** -- `normalizeClaude` only extracted `prompt` for `user_prompt` events. Now extracts for all events (PreCompact, etc.), preserving context that would otherwise be lost.
261
378
 
262
- ## [0.9.14] 2026-02-26
379
+ ## [0.9.14] -- 2026-02-26
263
380
 
264
381
  ### Fixed
265
- - **🔴 Critical: Hooks never auto-store during development** Two root causes:
382
+ - **🔴 Critical: Hooks never auto-store during development** -- Two root causes:
266
383
  1. `extractContent()` had a fatal `parts.length === 0` guard that skipped rich `toolInput` data (file content, edit diffs, commands) whenever `toolResult` was present. Since all agents send short `toolResult` like `"File written successfully"` (28 chars), the content was always < 100 chars and got rejected by `MIN_STORE_LENGTH`.
267
384
  2. Bash/shell tool events (npm install, npm test, git commands) also got rejected because their content (~90 chars) fell below the generic `post_tool` threshold of 200 chars, even though commands are inherently meaningful.
268
385
  - **Fix**: Always extract `toolInput` fields alongside `toolResult`. Bash tools now use a dedicated low-threshold path (50 chars) with noise command filtering, matching the `post_command` logic.
269
386
 
270
387
  ### Added
271
- - **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).
388
+ - **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).
272
389
 
273
- ## [0.9.12] 2026-02-25
390
+ ## [0.9.12] -- 2026-02-25
274
391
 
275
392
  ### Fixed
276
- - **Copilot hooks format completely wrong** Was reusing Claude Code's `generateClaudeConfig()` (PascalCase events, `command` field). Copilot requires `version: 1`, `bash`/`powershell` fields, `timeoutSec`, and camelCase event names (`sessionStart`, `userPromptSubmitted`, `preToolUse`, `postToolUse`, `sessionEnd`, `errorOccurred`). Now uses dedicated `generateCopilotConfig()`. Source: [GitHub Docs](https://docs.github.com/en/copilot/reference/hooks-configuration).
277
- - **Codex fake hooks.json removed** Codex has no hooks system (only `notify` in config.toml for `agent-turn-complete`). Was generating a non-existent `.codex/hooks.json`. Now only installs rules (AGENTS.md). Source: [OpenAI Codex Config Reference](https://developers.openai.com/codex/config-reference/).
278
- - **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](https://kiro.dev/docs/hooks/).
279
- - **Kiro only had 1 event** Was only `file_saved`. Now covers `agent_stop`, `prompt_submit`, and `file_save` events.
393
+ - **Copilot hooks format completely wrong** -- Was reusing Claude Code's `generateClaudeConfig()` (PascalCase events, `command` field). Copilot requires `version: 1`, `bash`/`powershell` fields, `timeoutSec`, and camelCase event names (`sessionStart`, `userPromptSubmitted`, `preToolUse`, `postToolUse`, `sessionEnd`, `errorOccurred`). Now uses dedicated `generateCopilotConfig()`. Source: [GitHub Docs](https://docs.github.com/en/copilot/reference/hooks-configuration).
394
+ - **Codex fake hooks.json removed** -- Codex has no hooks system (only `notify` in config.toml for `agent-turn-complete`). Was generating a non-existent `.codex/hooks.json`. Now only installs rules (AGENTS.md). Source: [OpenAI Codex Config Reference](https://developers.openai.com/codex/config-reference/).
395
+ - **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](https://kiro.dev/docs/hooks/).
396
+ - **Kiro only had 1 event** -- Was only `file_saved`. Now covers `agent_stop`, `prompt_submit`, and `file_save` events.
280
397
 
281
398
  ### Added
282
- - **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](https://geminicli.com/docs/hooks/).
283
- - **Copilot normalizer** Dedicated `normalizeCopilot()` function with `inferCopilotEvent()` for payload-based event detection (Copilot sends typed payloads without explicit event names).
284
- - **Gemini CLI normalizer** Dedicated `normalizeGemini()` function with event mapping for all 11 Gemini CLI events (`BeforeAgent`, `AfterAgent`, `BeforeTool`, `AfterTool`, `PreCompress`, etc.).
285
- - **Gemini CLI event mappings** Full EVENT_MAP entries for Gemini CLI PascalCase events normalized events.
286
- - **Copilot event mappings** EVENT_MAP entries for Copilot-specific camelCase events (`userPromptSubmitted`, `preToolUse`, `postToolUse`, `errorOccurred`).
399
+ - **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](https://geminicli.com/docs/hooks/).
400
+ - **Copilot normalizer** -- Dedicated `normalizeCopilot()` function with `inferCopilotEvent()` for payload-based event detection (Copilot sends typed payloads without explicit event names).
401
+ - **Gemini CLI normalizer** -- Dedicated `normalizeGemini()` function with event mapping for all 11 Gemini CLI events (`BeforeAgent`, `AfterAgent`, `BeforeTool`, `AfterTool`, `PreCompress`, etc.).
402
+ - **Gemini CLI event mappings** -- Full EVENT_MAP entries for Gemini CLI PascalCase events -> normalized events.
403
+ - **Copilot event mappings** -- EVENT_MAP entries for Copilot-specific camelCase events (`userPromptSubmitted`, `preToolUse`, `postToolUse`, `errorOccurred`).
287
404
 
288
- ## [0.9.11] 2026-02-25
405
+ ## [0.9.11] -- 2026-02-25
289
406
 
290
407
  ### Fixed
291
- - **CLI crashes with `Dynamic require of "fs" is not supported`** When bundling CJS dependencies (like `gray-matter`) into ESM output via `noExternal`, esbuild's CJS-to-ESM wrapper couldn't resolve Node.js built-in modules. Added `createRequire` banner to provide a real `require` function before esbuild's wrapper runs, fixing `require('fs')` and other built-in module calls.
408
+ - **CLI crashes with `Dynamic require of "fs" is not supported`** -- When bundling CJS dependencies (like `gray-matter`) into ESM output via `noExternal`, esbuild's CJS-to-ESM wrapper couldn't resolve Node.js built-in modules. Added `createRequire` banner to provide a real `require` function before esbuild's wrapper runs, fixing `require('fs')` and other built-in module calls.
292
409
 
293
- ## [0.9.10] 2026-02-25
410
+ ## [0.9.10] -- 2026-02-25
294
411
 
295
412
  ### Fixed
296
- - **CLI crashes with `ERR_MODULE_NOT_FOUND` on global install** `@orama/orama`, `gpt-tokenizer`, `gray-matter` and other dependencies were not bundled into the CLI output. tsup treated `dependencies` as external by default. Added `noExternal` to force-bundle all deps into CLI (275KB 2.59MB), making `memorix hook` work reliably when installed globally via `npm install -g`.
297
- - **Cursor agent detection corrected** Real Cursor payload confirmed to include `hook_event_name` + `conversation_id` (not just `workspace_roots`). Detection now uses `conversation_id` or `cursor_version` as primary discriminator vs Claude Code (which sends `session_id` without `conversation_id`). `extractEventName` reads `hook_event_name` first, falls back to payload inference.
413
+ - **CLI crashes with `ERR_MODULE_NOT_FOUND` on global install** -- `@orama/orama`, `gpt-tokenizer`, `gray-matter` and other dependencies were not bundled into the CLI output. tsup treated `dependencies` as external by default. Added `noExternal` to force-bundle all deps into CLI (275KB -> 2.59MB), making `memorix hook` work reliably when installed globally via `npm install -g`.
414
+ - **Cursor agent detection corrected** -- Real Cursor payload confirmed to include `hook_event_name` + `conversation_id` (not just `workspace_roots`). Detection now uses `conversation_id` or `cursor_version` as primary discriminator vs Claude Code (which sends `session_id` without `conversation_id`). `extractEventName` reads `hook_event_name` first, falls back to payload inference.
298
415
 
299
- ## [0.9.9] 2026-02-25
416
+ ## [0.9.9] -- 2026-02-25
300
417
 
301
418
  ### Fixed
302
- - **Cursor hooks config format invalid** Generated config was missing required `version` field and used objects instead of arrays for hook scripts. Cursor requires `{ version: 1, hooks: { eventName: [{ command: "..." }] } }` format. Added `sessionStart`, `beforeShellExecution`, `afterMCPExecution`, `preCompact` events.
303
- - **Cursor agent detection failed** Cursor does NOT send `hook_event_name` like 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`).
304
- - **Cursor `session_id` field not read** Normalizer expected `conversation_id` but Cursor sends `session_id`. Now reads both with fallback.
419
+ - **Cursor hooks config format invalid** -- Generated config was missing required `version` field and used objects instead of arrays for hook scripts. Cursor requires `{ version: 1, hooks: { eventName: [{ command: "..." }] } }` format. Added `sessionStart`, `beforeShellExecution`, `afterMCPExecution`, `preCompact` events.
420
+ - **Cursor agent detection failed** -- Cursor does NOT send `hook_event_name` like 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`).
421
+ - **Cursor `session_id` field not read** -- Normalizer expected `conversation_id` but Cursor sends `session_id`. Now reads both with fallback.
305
422
 
306
- ## [0.9.8] 2026-02-25
423
+ ## [0.9.8] -- 2026-02-25
307
424
 
308
425
  ### Fixed
309
- - **Claude Code hooks installed to wrong file** Hooks were written to `.github/hooks/memorix.json` but Claude Code reads from `.claude/settings.local.json` (project-level) or `~/.claude/settings.json` (global). Now correctly writes to `.claude/settings.local.json` for project-level installation.
310
- - **Hooks merge overwrites existing settings** Shallow spread `{...existing, ...generated}` would overwrite the entire `hooks` key, destroying user's other hook configurations. Now deep-merges the `hooks` object so existing hooks from other tools are preserved.
426
+ - **Claude Code hooks installed to wrong file** -- Hooks were written to `.github/hooks/memorix.json` but Claude Code reads from `.claude/settings.local.json` (project-level) or `~/.claude/settings.json` (global). Now correctly writes to `.claude/settings.local.json` for project-level installation.
427
+ - **Hooks merge overwrites existing settings** -- Shallow spread `{...existing, ...generated}` would overwrite the entire `hooks` key, destroying user's other hook configurations. Now deep-merges the `hooks` object so existing hooks from other tools are preserved.
311
428
 
312
- ## [0.9.7] 2026-02-25
429
+ ## [0.9.7] -- 2026-02-25
313
430
 
314
431
  ### Fixed
315
- - **Claude Code hooks never triggering auto-memory** Claude Code sends `hook_event_name` (snake_case) but the normalizer expected `hookEventName` (camelCase). This caused **every event** (SessionStart, UserPromptSubmit, PostToolUse, PreCompact, Stop) to be misidentified as `post_tool`, breaking event routing, prompt extraction, memory injection, and session tracking. Also fixed `session_id` `sessionId` and `tool_response` `toolResult` field mappings.
316
- - **Empty content extraction from Claude Code tool events** `extractContent()` now unpacks `toolInput` fields (Bash commands, Write file content, etc.) when no other content is available. Previously tool events produced empty or near-empty content strings.
317
- - **User prompts silently dropped** `MIN_STORE_LENGTH=100` was too high for typical user prompts. Added `MIN_PROMPT_LENGTH=20` specifically for `user_prompt` events.
318
- - **Post-tool events too aggressively filtered** Tool events with substantial content (>200 chars) are now stored even without keyword pattern matches.
432
+ - **Claude Code hooks never triggering auto-memory** -- Claude Code sends `hook_event_name` (snake_case) but the normalizer expected `hookEventName` (camelCase). This caused **every event** (SessionStart, UserPromptSubmit, PostToolUse, PreCompact, Stop) to be misidentified as `post_tool`, breaking event routing, prompt extraction, memory injection, and session tracking. Also fixed `session_id` -> `sessionId` and `tool_response` -> `toolResult` field mappings.
433
+ - **Empty content extraction from Claude Code tool events** -- `extractContent()` now unpacks `toolInput` fields (Bash commands, Write file content, etc.) when no other content is available. Previously tool events produced empty or near-empty content strings.
434
+ - **User prompts silently dropped** -- `MIN_STORE_LENGTH=100` was too high for typical user prompts. Added `MIN_PROMPT_LENGTH=20` specifically for `user_prompt` events.
435
+ - **Post-tool events too aggressively filtered** -- Tool events with substantial content (>200 chars) are now stored even without keyword pattern matches.
319
436
 
320
- ## [0.9.6] 2026-02-25
437
+ ## [0.9.6] -- 2026-02-25
321
438
 
322
439
  ### Fixed
323
- - **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/repo` vs `local/repo` vs `local/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/`).
324
- - **`scope: 'project'` parameter now works** Previously accepted but ignored. Now properly filters search results by the current project's ID via Orama where-clause.
440
+ - **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/repo` vs `local/repo` vs `local/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/`).
441
+ - **`scope: 'project'` parameter now works** -- Previously accepted but ignored. Now properly filters search results by the current project's ID via Orama where-clause.
325
442
 
326
- ## [0.9.5] 2026-02-25
443
+ ## [0.9.5] -- 2026-02-25
327
444
 
328
445
  ### Fixed
329
- - **Claude Code hooks `matcher` format** `matcher` must be a **string** (tool name pattern like `"Bash"`, `"Edit|Write"`), not an object. For hooks that should fire on ALL events, `matcher` is now omitted entirely instead of using `{}`. Fixes `matcher: Expected string, but received object` validation error on Claude Code startup.
446
+ - **Claude Code hooks `matcher` format** -- `matcher` must be a **string** (tool name pattern like `"Bash"`, `"Edit|Write"`), not an object. For hooks that should fire on ALL events, `matcher` is now omitted entirely instead of using `{}`. Fixes `matcher: Expected string, but received object` validation error on Claude Code startup.
330
447
 
331
- ## [0.9.4] 2026-02-25
448
+ ## [0.9.4] -- 2026-02-25
332
449
 
333
450
  ### Fixed
334
- - **Codex/all-IDE `tools/list -> Method not found`** Critical bug where `local/<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 MCP `initialize` handshake declared no `tools` capability, causing all subsequent `tools/list` calls 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).
451
+ - **Codex/all-IDE `tools/list -> Method not found`** -- Critical bug where `local/<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 MCP `initialize` handshake declared no `tools` capability, causing all subsequent `tools/list` calls 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).
335
452
 
336
- ## [0.9.3] 2026-02-25
453
+ ## [0.9.3] -- 2026-02-25
337
454
 
338
455
  ### Fixed
339
- - **`memorix_timeline` "not found" bug** Timeline was using unreliable Orama empty-term search. Now uses in-memory observations (same fix pattern as `memorix_detail`).
340
- - **`memorix_retention` "no observations found" bug** Same root cause as timeline. Now uses in-memory observations for reliable document retrieval.
341
- - **`memorix_search` cross-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.
342
- - **Claude Code hooks format** Updated `generateClaudeConfig` to use the new `{matcher: {}, hooks: [...]}` structure required by Claude Code 2025+. Fixes "Expected array, but received undefined" error on `memorix hooks install --agent claude --global`.
343
- - **EPERM `process.cwd()` crash** All CLI commands (`serve`, `hooks install/uninstall/status`) now safely handle `process.cwd()` failures (e.g., deleted CWD on macOS) with fallback to home directory.
456
+ - **`memorix_timeline` "not found" bug** -- Timeline was using unreliable Orama empty-term search. Now uses in-memory observations (same fix pattern as `memorix_detail`).
457
+ - **`memorix_retention` "no observations found" bug** -- Same root cause as timeline. Now uses in-memory observations for reliable document retrieval.
458
+ - **`memorix_search` cross-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.
459
+ - **Claude Code hooks format** -- Updated `generateClaudeConfig` to use the new `{matcher: {}, hooks: [...]}` structure required by Claude Code 2025+. Fixes "Expected array, but received undefined" error on `memorix hooks install --agent claude --global`.
460
+ - **EPERM `process.cwd()` crash** -- All CLI commands (`serve`, `hooks install/uninstall/status`) now safely handle `process.cwd()` failures (e.g., deleted CWD on macOS) with fallback to home directory.
344
461
 
345
- ## [0.9.2] 2026-02-25
462
+ ## [0.9.2] -- 2026-02-25
346
463
 
347
464
  ### Fixed
348
- - **Empty directory support** Memorix now starts successfully in any directory, even without `.git` or `package.json`. No more `__invalid__` project errors for brand new folders. Only truly dangerous directories (home dir, drive root, system dirs) are rejected.
349
- - **`findPackageRoot` safety** Walking up from temp/nested directories no longer accidentally selects the home directory as project root.
465
+ - **Empty directory support** -- Memorix now starts successfully in any directory, even without `.git` or `package.json`. No more `__invalid__` project errors for brand new folders. Only truly dangerous directories (home dir, drive root, system dirs) are rejected.
466
+ - **`findPackageRoot` safety** -- Walking up from temp/nested directories no longer accidentally selects the home directory as project root.
350
467
 
351
468
  ### Changed
352
- - **README rewrite** Complete rewrite of Quick Start section for both EN and 中文 READMEs:
469
+ - **README rewrite** -- Complete rewrite of Quick Start section for both EN and 中文 READMEs:
353
470
  - Two-step install (global install + MCP config) instead of error-prone `npx`
354
471
  - Per-agent config examples (Claude Code, Cursor, Windsurf, etc.)
355
472
  - Troubleshooting table for common errors
356
473
  - AI-friendly: agents reading the README will now configure correctly on first try
357
474
 
358
- ## [0.9.1] 2026-02-25
475
+ ## [0.9.1] -- 2026-02-25
359
476
 
360
477
  ### Fixed
361
- - **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](https://github.com/anthropics/claude-code/issues/5504), [#26027](https://github.com/anthropics/claude-code/issues/26027)) and non-Anthropic models (GLM, etc.) that may produce incorrectly typed tool call arguments. Codex, Windsurf, and Cursor were already unaffected.
478
+ - **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](https://github.com/anthropics/claude-code/issues/5504), [#26027](https://github.com/anthropics/claude-code/issues/26027)) and non-Anthropic models (GLM, etc.) that may produce incorrectly typed tool call arguments. Codex, Windsurf, and Cursor were already unaffected.
362
479
 
363
- ## [0.9.0] 2026-02-24
480
+ ## [0.9.0] -- 2026-02-24
364
481
 
365
482
  ### Added
366
- - **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. Supports `preview` (dry run) and `execute` modes with configurable similarity threshold.
367
- - **Temporal Queries** `memorix_search` now supports `since` and `until` parameters for date range filtering. Example: "What auth decisions did we make last week?"
368
- - **Explainable Recall** Search results now include a `Matched` column showing which fields matched the query (title, entity, concept, narrative, fact, file, or fuzzy). Helps understand why each result was found.
369
- - **Export/Import** Two new tools for team collaboration:
370
- - `memorix_export` Export project observations and sessions as JSON (importable) or Markdown (human-readable for PRs/docs)
371
- - `memorix_import` Import from JSON export, re-assigns IDs, skips duplicate topicKeys
372
- - **Dashboard Sessions Panel** New "Sessions" tab in the web dashboard with timeline view, active/completed counts, agent info, and session summaries. Bilingual (EN/中文).
373
- - **Auto sessionId** `memorix_store` now automatically associates the current active session's ID with stored observations.
374
- - **16 new tests** 8 consolidation + 8 export/import (484 total).
483
+ - **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. Supports `preview` (dry run) and `execute` modes with configurable similarity threshold.
484
+ - **Temporal Queries** -- `memorix_search` now supports `since` and `until` parameters for date range filtering. Example: "What auth decisions did we make last week?"
485
+ - **Explainable Recall** -- Search results now include a `Matched` column showing which fields matched the query (title, entity, concept, narrative, fact, file, or fuzzy). Helps understand why each result was found.
486
+ - **Export/Import** -- Two new tools for team collaboration:
487
+ - `memorix_export` -- Export project observations and sessions as JSON (importable) or Markdown (human-readable for PRs/docs)
488
+ - `memorix_import` -- Import from JSON export, re-assigns IDs, skips duplicate topicKeys
489
+ - **Dashboard Sessions Panel** -- New "Sessions" tab in the web dashboard with timeline view, active/completed counts, agent info, and session summaries. Bilingual (EN/中文).
490
+ - **Auto sessionId** -- `memorix_store` now automatically associates the current active session's ID with stored observations.
491
+ - **16 new tests** -- 8 consolidation + 8 export/import (484 total).
375
492
 
376
493
  ### Stats
377
- - **MCP Tools:** 20 24 (memorix_consolidate, memorix_export, memorix_import + dashboard sessions API)
494
+ - **MCP Tools:** 20 -> 24 (memorix_consolidate, memorix_export, memorix_import + dashboard sessions API)
378
495
  - **Tests:** 484/484 passing
379
496
 
380
- ## [0.8.0] 2026-02-24
497
+ ## [0.8.0] -- 2026-02-24
381
498
 
382
499
  ### Added
383
- - **Session Lifecycle Management** 3 new MCP tools for cross-session context continuity:
384
- - `memorix_session_start` Start a coding session, auto-inject context from previous sessions (summaries + key observations). Previous active sessions are auto-closed.
385
- - `memorix_session_end` End a session with structured summary (Goal/Discoveries/Accomplished/Files format). Summary is injected into the next session.
386
- - `memorix_session_context` Manually retrieve session history and context (useful after compaction recovery).
387
- - **Topic Key Upsert** `memorix_store` now accepts an optional `topicKey` parameter. When an observation with the same `topicKey + projectId` already exists, it is **updated in-place** instead of creating a duplicate. `revisionCount` increments on each upsert. Prevents data bloat for evolving decisions, architecture docs, etc.
388
- - **`memorix_suggest_topic_key` tool** Suggests stable topic keys from type + title using family heuristics (`architecture/*`, `bug/*`, `decision/*`, `config/*`, `discovery/*`, `pattern/*`). Supports CJK characters.
389
- - **Session persistence** `sessions.json` with atomic writes and file locking for cross-process safety.
390
- - **Observation fields** `topicKey`, `revisionCount`, `updatedAt`, `sessionId` added to `Observation` interface.
391
- - **30 new tests** 16 session lifecycle tests + 14 topic key upsert tests (468 total).
500
+ - **Session Lifecycle Management** -- 3 new MCP tools for cross-session context continuity:
501
+ - `memorix_session_start` -- Start a coding session, auto-inject context from previous sessions (summaries + key observations). Previous active sessions are auto-closed.
502
+ - `memorix_session_end` -- End a session with structured summary (Goal/Discoveries/Accomplished/Files format). Summary is injected into the next session.
503
+ - `memorix_session_context` -- Manually retrieve session history and context (useful after compaction recovery).
504
+ - **Topic Key Upsert** -- `memorix_store` now accepts an optional `topicKey` parameter. When an observation with the same `topicKey + projectId` already exists, it is **updated in-place** instead of creating a duplicate. `revisionCount` increments on each upsert. Prevents data bloat for evolving decisions, architecture docs, etc.
505
+ - **`memorix_suggest_topic_key` tool** -- Suggests stable topic keys from type + title using family heuristics (`architecture/*`, `bug/*`, `decision/*`, `config/*`, `discovery/*`, `pattern/*`). Supports CJK characters.
506
+ - **Session persistence** -- `sessions.json` with atomic writes and file locking for cross-process safety.
507
+ - **Observation fields** -- `topicKey`, `revisionCount`, `updatedAt`, `sessionId` added to `Observation` interface.
508
+ - **30 new tests** -- 16 session lifecycle tests + 14 topic key upsert tests (468 total).
392
509
 
393
510
  ### Improved
394
- - **`storeObservation` API** Now returns `{ observation, upserted }` instead of just `Observation`, enabling callers to distinguish new vs updated observations.
511
+ - **`storeObservation` API** -- Now returns `{ observation, upserted }` instead of just `Observation`, enabling callers to distinguish new vs updated observations.
395
512
 
396
513
  ### Inspired by
397
- - [Engram](https://github.com/alanbuscaglia/engram) Session lifecycle design, topic_key upsert pattern, structured session summaries.
514
+ - [Engram](https://github.com/alanbuscaglia/engram) -- Session lifecycle design, topic_key upsert pattern, structured session summaries.
398
515
 
399
- ## [0.7.11] 2026-02-24
516
+ ## [0.7.11] -- 2026-02-24
400
517
 
401
518
  ### Added
402
- - **File locking & atomic writes** (`withFileLock`, `atomicWriteFile`) Cross-process safe writes for `observations.json`, `graph.jsonl`, and `counter.json`. Uses `.memorix.lock` directory lock with stale detection (10s timeout) and write-to-temp-then-rename for crash safety.
403
- - **Retention auto-archive** `memorix_retention` tool now supports `action="archive"` to move expired observations to `observations.archived.json`. Reversible archived memories can be restored manually.
404
- - **Chinese entity extraction** Entity extractor now recognizes Chinese identifiers in brackets (`「认证模块」`, `【数据库连接】`) and backticks, plus Chinese causal language patterns (因为/所以/由于/导致/决定/采用).
405
- - **Graph-memory bidirectional sync** Dashboard DELETE now cleans up corresponding `[#id]` references from knowledge graph entities. Prevents orphaned data.
519
+ - **File locking & atomic writes** (`withFileLock`, `atomicWriteFile`) -- Cross-process safe writes for `observations.json`, `graph.jsonl`, and `counter.json`. Uses `.memorix.lock` directory lock with stale detection (10s timeout) and write-to-temp-then-rename for crash safety.
520
+ - **Retention auto-archive** -- `memorix_retention` tool now supports `action="archive"` to move expired observations to `observations.archived.json`. Reversible -- archived memories can be restored manually.
521
+ - **Chinese entity extraction** -- Entity extractor now recognizes Chinese identifiers in brackets (`「认证模块」`, `【数据库连接】`) and backticks, plus Chinese causal language patterns (因为/所以/由于/导致/决定/采用).
522
+ - **Graph-memory bidirectional sync** -- Dashboard DELETE now cleans up corresponding `[#id]` references from knowledge graph entities. Prevents orphaned data.
406
523
 
407
524
  ### Improved
408
- - **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).
409
- - **Auto-relations performance** Entity lookups now use O(1) index (`Map`) instead of O(n) `find()` on every observation store. `KnowledgeGraphManager` maintains a `entityIndex` rebuilt on create/delete mutations.
410
- - **Re-read-before-write** `storeObservation` re-reads `observations.json` inside the lock before writing, merging concurrent changes instead of overwriting.
525
+ - **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).
526
+ - **Auto-relations performance** -- Entity lookups now use O(1) index (`Map`) instead of O(n) `find()` on every observation store. `KnowledgeGraphManager` maintains a `entityIndex` rebuilt on create/delete mutations.
527
+ - **Re-read-before-write** -- `storeObservation` re-reads `observations.json` inside the lock before writing, merging concurrent changes instead of overwriting.
411
528
 
412
- ## [0.7.10] 2026-02-24
529
+ ## [0.7.10] -- 2026-02-24
413
530
 
414
531
  ### Added
415
- - **Chinese README** (`README.zh-CN.md`) Full bilingual documentation with language switcher at the top of both README files.
416
- - **Antigravity config guide** Collapsible note in README Quick Start and updated `docs/SETUP.md` Antigravity section explaining the `MEMORIX_PROJECT_ROOT` requirement, why it's needed (cwd + MCP roots both unavailable), and how to configure it.
417
- - **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.
532
+ - **Chinese README** (`README.zh-CN.md`) -- Full bilingual documentation with language switcher at the top of both README files.
533
+ - **Antigravity config guide** -- Collapsible note in README Quick Start and updated `docs/SETUP.md` Antigravity section explaining the `MEMORIX_PROJECT_ROOT` requirement, why it's needed (cwd + MCP roots both unavailable), and how to configure it.
534
+ - **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.
418
535
 
419
- ## [0.7.9] 2026-02-24
536
+ ## [0.7.9] -- 2026-02-24
420
537
 
421
538
  ### Fixed
422
- - **Dashboard auto-switch when project changes** When the dashboard is already running (started from project A) and `memorix_dashboard` is called from project B, the dashboard server's current project is now updated via a `/api/set-current-project` POST 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.
539
+ - **Dashboard auto-switch when project changes** -- When the dashboard is already running (started from project A) and `memorix_dashboard` is called from project B, the dashboard server's current project is now updated via a `/api/set-current-project` POST 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.
423
540
 
424
541
  ### Added
425
- - **MCP roots protocol support** When the IDE's `cwd` is not a valid project (e.g., Antigravity sets cwd to `G:\Antigravity`), Memorix now automatically tries the MCP `roots/list` protocol to get the IDE's actual workspace path. This means standard MCP configs (`npx memorix@latest serve`) can work without `--cwd` in 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.
542
+ - **MCP roots protocol support** -- When the IDE's `cwd` is not a valid project (e.g., Antigravity sets cwd to `G:\Antigravity`), Memorix now automatically tries the MCP `roots/list` protocol to get the IDE's actual workspace path. This means standard MCP configs (`npx memorix@latest serve`) can work without `--cwd` in 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.
426
543
 
427
- ## [0.7.8] 2026-02-24
544
+ ## [0.7.8] -- 2026-02-24
428
545
 
429
546
  ### Fixed
430
- - **Graceful error on invalid project detection** When `detectProject()` returns `__invalid__` (e.g., IDE sets cwd to its own install directory like `G:\Antigravity`), the server now prints a clear, actionable error message with fix instructions (`--cwd` or `MEMORIX_PROJECT_ROOT`) instead of crashing with an opaque stack trace.
431
- - **Dashboard process liveness check** `memorix_dashboard` now 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.
547
+ - **Graceful error on invalid project detection** -- When `detectProject()` returns `__invalid__` (e.g., IDE sets cwd to its own install directory like `G:\Antigravity`), the server now prints a clear, actionable error message with fix instructions (`--cwd` or `MEMORIX_PROJECT_ROOT`) instead of crashing with an opaque stack trace.
548
+ - **Dashboard process liveness check** -- `memorix_dashboard` now 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.
432
549
 
433
550
  ### Added
434
- - **`MEMORIX_PROJECT_ROOT` environment variable** New way to specify the project directory for IDEs that don't set `cwd` to the project path (e.g., Antigravity uses `G:\Antigravity` as cwd). Priority: `--cwd` > `MEMORIX_PROJECT_ROOT` > `INIT_CWD` > `process.cwd()`. Example MCP config: `"env": { "MEMORIX_PROJECT_ROOT": "e:/your/project" }`.
551
+ - **`MEMORIX_PROJECT_ROOT` environment variable** -- New way to specify the project directory for IDEs that don't set `cwd` to the project path (e.g., Antigravity uses `G:\Antigravity` as cwd). Priority: `--cwd` > `MEMORIX_PROJECT_ROOT` > `INIT_CWD` > `process.cwd()`. Example MCP config: `"env": { "MEMORIX_PROJECT_ROOT": "e:/your/project" }`.
435
552
 
436
- ## [0.7.7] 2026-02-24
553
+ ## [0.7.7] -- 2026-02-24
437
554
 
438
555
  ### Fixed
439
- - **Wrong project detection in Antigravity/global MCP configs** Removed dangerous `scriptDir` fallback in `serve.ts` that caused the MCP server to detect the memorix development repo (or other wrong projects) instead of the user's actual project. When `process.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 on `detectProject()` which has proper fallback logic.
440
- - **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.
556
+ - **Wrong project detection in Antigravity/global MCP configs** -- Removed dangerous `scriptDir` fallback in `serve.ts` that caused the MCP server to detect the memorix development repo (or other wrong projects) instead of the user's actual project. When `process.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 on `detectProject()` which has proper fallback logic.
557
+ - **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.
441
558
 
442
- ## [0.7.6] 2026-02-24
559
+ ## [0.7.6] -- 2026-02-24
443
560
 
444
561
  ### Added
445
- - **`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.
446
- - **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.)
562
+ - **`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.
563
+ - **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.)
447
564
 
448
565
  ### Changed
449
- - **GitHub repo description** Shortened to ~150 chars for optimal og:title/og:description generation
450
- - **GitHub topics** 20 GEO-optimized tags including `cursor-mcp`, `windsurf-mcp`, `claude-code-memory`, `cross-ide-sync`, `context-persistence`, `agent-memory`
451
- - **package.json keywords** Replaced generic tags with IDE-specific MCP entity-linking keywords
452
- - **package.json description** Shortened to under 160 chars for better meta tag generation
453
- - **MCP tool descriptions** Enhanced `memorix_store`, `memorix_search`, `memorix_workspace_sync`, `memorix_skills` with cross-IDE context so AI search engines understand what problems they solve
566
+ - **GitHub repo description** -- Shortened to ~150 chars for optimal og:title/og:description generation
567
+ - **GitHub topics** -- 20 GEO-optimized tags including `cursor-mcp`, `windsurf-mcp`, `claude-code-memory`, `cross-ide-sync`, `context-persistence`, `agent-memory`
568
+ - **package.json keywords** -- Replaced generic tags with IDE-specific MCP entity-linking keywords
569
+ - **package.json description** -- Shortened to under 160 chars for better meta tag generation
570
+ - **MCP tool descriptions** -- Enhanced `memorix_store`, `memorix_search`, `memorix_workspace_sync`, `memorix_skills` with cross-IDE context so AI search engines understand what problems they solve
454
571
 
455
- ## [0.7.5] 2026-02-22
572
+ ## [0.7.5] -- 2026-02-22
456
573
 
457
574
  ### Changed
458
- - **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.
459
- - **New `docs/SETUP.md`** Dedicated setup guide with agent-specific config, vector search setup, data storage, and troubleshooting
575
+ - **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.
576
+ - **New `docs/SETUP.md`** -- Dedicated setup guide with agent-specific config, vector search setup, data storage, and troubleshooting
460
577
 
461
- ## [0.7.4] 2026-02-22
578
+ ## [0.7.4] -- 2026-02-22
462
579
 
463
580
  ### Fixed
464
- - **Hyphenated concepts not searchable** Concepts like `project-detection` and `bug-fix` are now normalized to `project detection` and `bug fix` in the search index so Orama's tokenizer can split them into individual searchable terms. Original observation data is preserved unchanged.
581
+ - **Hyphenated concepts not searchable** -- Concepts like `project-detection` and `bug-fix` are now normalized to `project detection` and `bug fix` in the search index so Orama's tokenizer can split them into individual searchable terms. Original observation data is preserved unchanged.
465
582
 
466
- ## [0.7.3] 2026-02-22
583
+ ## [0.7.3] -- 2026-02-22
467
584
 
468
585
  ### Fixed
469
- - **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/config` file. This fixes projects incorrectly getting `local/<dirname>` instead of `owner/repo` as their project ID.
586
+ - **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/config` file. This fixes projects incorrectly getting `local/<dirname>` instead of `owner/repo` as their project ID.
470
587
 
471
- ## [0.7.2] 2026-02-22
588
+ ## [0.7.2] -- 2026-02-22
472
589
 
473
590
  ### Fixed
474
- - **`memorix_workspace_sync` rejects `kiro` as target** Added `kiro` to `AGENT_TARGETS` enum (adapter was already implemented but missing from the tool's input schema)
475
- - **`memorix_rules_sync` missing `kiro` target** Added `kiro` to `RULE_SOURCES` enum so Kiro steering rules can be generated as a sync target
476
- - **VS Code Copilot README config** Separated `.vscode/mcp.json` (workspace) and `settings.json` (global) formats which have different JSON structures
591
+ - **`memorix_workspace_sync` rejects `kiro` as target** -- Added `kiro` to `AGENT_TARGETS` enum (adapter was already implemented but missing from the tool's input schema)
592
+ - **`memorix_rules_sync` missing `kiro` target** -- Added `kiro` to `RULE_SOURCES` enum so Kiro steering rules can be generated as a sync target
593
+ - **VS Code Copilot README config** -- Separated `.vscode/mcp.json` (workspace) and `settings.json` (global) formats which have different JSON structures
477
594
 
478
- ## [0.7.1] 2026-02-22
595
+ ## [0.7.1] -- 2026-02-22
479
596
 
480
597
  ### Fixed
481
- - **Dashboard checkbox checkmark not visible** Added `position: relative/absolute` to `.obs-checkbox::after` so the ✓ renders correctly in batch select mode
482
- - **Embedding provider status flickers to "fulltext only"** Replaced `initialized` boolean flag with a shared Promise lock; concurrent callers now wait for the same initialization instead of seeing `provider = null` mid-load
483
- - **`memorix_dashboard` MCP 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
484
- - **Dashboard embedding status always shows "fulltext only"** Fixed root cause: dashboard is an independent process, `isEmbeddingEnabled()` from orama-store always returns false there; now uses `provider !== null` directly
598
+ - **Dashboard checkbox checkmark not visible** -- Added `position: relative/absolute` to `.obs-checkbox::after` so the ✓ renders correctly in batch select mode
599
+ - **Embedding provider status flickers to "fulltext only"** -- Replaced `initialized` boolean flag with a shared Promise lock; concurrent callers now wait for the same initialization instead of seeing `provider = null` mid-load
600
+ - **`memorix_dashboard` MCP 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
601
+ - **Dashboard embedding status always shows "fulltext only"** -- Fixed root cause: dashboard is an independent process, `isEmbeddingEnabled()` from orama-store always returns false there; now uses `provider !== null` directly
485
602
 
486
- ## [0.7.0] 2026-02-21
603
+ ## [0.7.0] -- 2026-02-21
487
604
 
488
605
  ### Added
489
606
  - **Memory-Driven Skills Engine** (`memorix_skills` MCP tool):
490
- - `list` Discover all `SKILL.md` files across 7 agent directories
491
- - `generate` Auto-generate project-specific skills from observation patterns (gotchas, decisions, how-it-works)
492
- - `inject` Return full skill content directly to agent context
607
+ - `list` -- Discover all `SKILL.md` files across 7 agent directories
608
+ - `generate` -- Auto-generate project-specific skills from observation patterns (gotchas, decisions, how-it-works)
609
+ - `inject` -- Return full skill content directly to agent context
493
610
  - Intelligent scoring: requires skill-worthy observation types, not just volume
494
611
  - Write to any target agent with `write: true, target: "<agent>"`
495
612
  - **Transformers.js Embedding Provider**:
496
- - Pure JavaScript fallback (`@huggingface/transformers`) no native deps required
497
- - Provider chain: `fastembed` `transformers.js` fulltext-only
613
+ - Pure JavaScript fallback (`@huggingface/transformers`) -- no native deps required
614
+ - Provider chain: `fastembed` -> `transformers.js` -> fulltext-only
498
615
  - Quantized model (`q8`) for small footprint
499
616
  - **Dashboard Enhancements**:
500
617
  - Canvas donut chart for observation type distribution
@@ -503,14 +620,14 @@ Memorix reaches v1.0.0 — all major features complete. Future versions will ite
503
620
  - **17 new tests** for Skills Engine (list, generate, inject, write, scoring, dedup)
504
621
 
505
622
  ### Changed
506
- - 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
507
- - Volume bonus reduced from 2×obs to 1×obs (capped at 5) to favor quality over quantity
623
+ - 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
624
+ - Volume bonus reduced from 2xobs to 1xobs (capped at 5) to favor quality over quantity
508
625
  - Type diversity bonus increased from 2 to 3 points per unique skill-worthy type
509
626
 
510
627
  ### Fixed
511
628
  - 422 tests passing (up from 405), 34 test files, zero regressions
512
629
 
513
- ## [0.5.0] 2026-02-15
630
+ ## [0.5.0] -- 2026-02-15
514
631
 
515
632
  ### Added
516
633
  - **Antigravity Adapter**: Full support for Antigravity/Gemini IDE (MCP config + rules)
@@ -527,11 +644,11 @@ Memorix reaches v1.0.0 — all major features complete. Future versions will ite
527
644
  ### Fixed
528
645
  - 274 tests passing (up from 219), zero regressions
529
646
 
530
- ## [0.1.0] 2026-02-14
647
+ ## [0.1.0] -- 2026-02-14
531
648
 
532
649
  ### Core
533
650
  - Knowledge Graph: Entity-Relation-Observation model (MCP Official compatible)
534
- - 3-Layer Progressive Disclosure: compact search timeline detail
651
+ - 3-Layer Progressive Disclosure: compact search -> timeline -> detail
535
652
  - 9 observation types with icon classification
536
653
  - Full-text search via Orama (BM25)
537
654
  - Per-project isolation via Git remote detection
@@ -539,7 +656,7 @@ Memorix reaches v1.0.0 — all major features complete. Future versions will ite
539
656
 
540
657
  ### Cross-Agent Sync
541
658
  - Rules Parser: 4 format adapters (Cursor, Claude Code, Codex, Windsurf)
542
- - Rules Syncer: scan deduplicate conflict detection cross-format generation
659
+ - Rules Syncer: scan -> deduplicate -> conflict detection -> cross-format generation
543
660
  - Workspace Sync: MCP config migration + workflow sync + apply with backup/rollback
544
661
 
545
662
  ### Intelligence (Competitor-Inspired)
@@ -556,7 +673,7 @@ Memorix reaches v1.0.0 — all major features complete. Future versions will ite
556
673
  - Embedding provider abstraction layer (extensible)
557
674
  - fastembed integration (optional, local ONNX, 384-dim bge-small)
558
675
  - Orama hybrid search mode (BM25 + vector)
559
- - Graceful degradation: no fastembed fulltext only
676
+ - Graceful degradation: no fastembed -> fulltext only
560
677
  - Embedding cache (5000 entries LRU)
561
678
 
562
679
  ### Agent Instructions