memorix 1.0.5 → 1.0.7

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,6 +2,139 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [1.0.7] - Unreleased
6
+
7
+ ### Visual Semantic Layering (dashboard follow-up)
8
+ - Team page headline is now **active-only**; `recent`/`historical` shown as secondary subtitle only.
9
+ - 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.
10
+ - Each agent row carries an explicit tier badge (Active/Recent/Historical) instead of a single "offline" sea of red.
11
+ - Historical agent rows are de-emphasized (reduced opacity, muted colors) so they don't dominate the main view.
12
+ - Identity page headline shows **real** project count + **real** alias groups only. Temporary/placeholder IDs moved into a collapsed "Historical / temporary project IDs" section.
13
+ - 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.
14
+ - 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.
15
+ - All new labels wired through the i18n system (English + Simplified Chinese).
16
+
17
+ ### Team Page Cleanup (1.0.7 final)
18
+ - **Team page semantics**: clearly presented as a **project collaboration space**, not an organization backend or staffing admin tool. Scope labels: "Project Collaboration" / "All Projects".
19
+ - **`memorix_session_start` auto-registration**: agents are automatically registered in the team with a default role derived from `agentType` via `AGENT_TYPE_ROLE_MAP` (e.g. `windsurf`→`engineer`, `gemini-cli`→`researcher`). No separate `team_manage(join)` call needed. Explicit role overrides the default.
20
+ - **"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.
21
+ - **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.
22
+
23
+ ### Added -- Multi-Agent Orchestrator (Phase 7)
24
+ - **`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.
25
+ - **CLI flags**: `--agents claude:2,codex:1`, `--goal`, `--parallel`, `--compile-command`, `--test-command`, `--max-fix`, `--budget`, `--routing`, `--memory-capture`, `--no-evidence`, `--global-timeout`
26
+
27
+ ### Added -- SQLite Canonical Store (Phase 2)
28
+ - Observations, mini-skills, sessions, archives all in SQLite. Shared DB handle, freshness-safe retrieval, in-place archiving.
29
+
30
+ ### Added -- Team Identity (Phase 4)
31
+ - Team store with agent registration, heartbeat, task board, handoff artifacts, stale detection. Prompt identity contract, sticky attribution prevention.
32
+
33
+ ### Fixed
34
+ - **#4** Parallel multi-agent — fully implemented via orchestrator
35
+ - **#52** observations.json perf — migrated to SQLite
36
+ - **#56** LLM rerank timeout — configurable via `MEMORIX_RERANK_TIMEOUT_MS`
37
+ - **#75** Cursor stdio binding — deferred-binding mode instead of exit
38
+ - **Gemini JSON parse** — brace-counting extractor handles trailing text
39
+ - **Evidence for failed tasks** — both fix-exhausted and normal failure paths now write evidence
40
+ - **Agent fallback** — failed agents excluded from retry routing
41
+ - **P1: uninstall hooks** — shared context files (AGENTS.md/GEMINI.md) now block-level removal instead of deleting entire file
42
+ - **P1: budget abort** — current settled dispatch now fails task (was left stuck in_progress)
43
+ - **P1: streaming completion** — waits for stdout/stderr close before resolving (was missing final JSONL lines)
44
+ - **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
45
+ - **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)
46
+ - **P1: reviewer hanging** — `--mcp-config` enables `memorix_handoff` / `team_task` MCP tool calls that reviewer needs for completion path
47
+ - **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
48
+ - **P2: budget validation** — CLI and coordinator reject NaN/negative/zero budget values
49
+ - **P2: streaming buffer** — bounded at 1024 messages with drop-oldest policy
50
+ - **P2: install audit** — recordFile called even when Memorix block already exists (audit self-heal on reinstall)
51
+ - **P2: install audit** — new shared file creation also records audit entry
52
+ - **P2: uninstall return** — rules-only agents (codex/gemini-cli) return true when audit cleanup succeeds
53
+ - **#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.
54
+ - **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.
55
+ - **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`.
56
+ - **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.
57
+ - **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.
58
+
59
+ ### Added -- 1.0.7 Closeout
60
+ - **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
61
+ - **Structured role extraction** — `extractRole()` prioritizes `metadata.role` over `[Role: ...]` text parsing; canonical source is structured metadata
62
+ - **Balanced scheduling** — `--scheduling balanced` policy with round-robin tiebreaker among equally-preferred adapters; `best-fit` remains default
63
+ - **Idle agent visibility** — pipeline summary includes `idleAgents` with reasons for non-participation
64
+ - **Pipeline summary extensions** — `routingDecisions` and `idleAgents` fields in `PipelineSummary` for full explainability
65
+ - **#62+#74** dashboard loadDotenv
66
+ - **#70** doctor health check
67
+ - **#69** background start non-TTY hang
68
+ - **#66** dashboard delete/cleanup/export
69
+ - **#79** Codex roots/list protocol compatibility
70
+ - **#18** dot-directory merge + hooks install migration
71
+
72
+ ### Removed -- Dead Code (Stabilization)
73
+ - **`src/store/json-store.ts`** — `JsonBackend` class deleted; no runtime or test references. SQLite is sole canonical backend, `DegradedBackend` is read-only fallback.
74
+ - **`appendArchivedObservations` / `loadArchivedObservations`** — dead code removed from `persistence-json.ts` and `persistence.ts` re-exports. Archives live in SQLite `status='archived'` rows.
75
+ - **`'json'` from `getBackendName()` return type** — union narrowed to `'sqlite' | 'degraded'` across `ObservationStore` interface, `SqliteBackend`, `DegradedBackend`.
76
+
77
+ ### Changed -- Stale Naming Cleanup
78
+ - All `JsonBackend` references in comments and test names replaced with `DegradedBackend`.
79
+ - `observations.ts:71` "For JsonBackend" → "For DegradedBackend".
80
+ - `obs-store.ts:91` "JsonBackend: no-op" → "DegradedBackend: no-op".
81
+ - `sqlite-store.test.ts:389` test name "falls back to JsonBackend" → "falls back to DegradedBackend", assertion `['sqlite', 'json']` → `['sqlite', 'degraded']`.
82
+
83
+ ### Fixed -- Dashboard Semantics Closure
84
+ - **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.
85
+ - **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.
86
+ - **Team page crash-proof** — `loadTeam()` safely normalizes missing/null fields (`a.id`, `tk.deps`, `l.lockedBy`). No more `Cannot read properties of undefined` errors.
87
+ - **Project switcher sync** — Switching project in the dashboard now calls `/api/set-current-project` to sync backend state.
88
+ - **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.
89
+ - **CLI help alignment** — `memorix dashboard` and `memorix serve-http` JSDoc now document mode semantics (Standalone=3210, Control Plane=3211). Startup logs show mode label.
90
+
91
+ ### Changed -- Test Suite Stabilization
92
+ - **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`.
93
+ - **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`.
94
+ - **Coordinator merge-conflict test** made deterministic — synchronous conflict file writes in `spawn()` instead of async `setTimeout` race. Removed `{ retry: 3 }`.
95
+ - **Default test suite**: 141 files, 1906 tests, **0 skipped, 0 failed**.
96
+
97
+ ### Added -- Hooks Test Coverage
98
+ - Audit ledger lost/corrupted → re-install recovers audit entry (codex).
99
+ - Non-shared-rules agent install/uninstall (claude) verifying config file creation and cleanup.
100
+
101
+ ## [1.0.6] - 2026-04-05
102
+
103
+ ### Added -- Memory Provenance and Layered Retrieval
104
+ - **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.
105
+ - **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.
106
+ - **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.
107
+ - **Verification-aware evidence** -- Detail and timeline outputs distinguish direct, summarized, derived, and repository-backed evidence without requiring a full citation framework.
108
+ - **Citation-lite** -- Evidence-bearing surfaces emit lightweight citation hints (`[source: git]`, `[verified: repo-backed]`) to support "why surfaced" and "what supports this" queries.
109
+ - **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.
110
+ - **Graph routing hints** -- Knowledge graph neighborhood is used for lightweight retrieval enrichment and entity-affinity scoring without a full graph rewrite.
111
+
112
+ ### Added -- Task-Line Scoping, Secret Safety, and Attribution Hardening
113
+ - **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.
114
+ - **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.
115
+ - **Project attribution hardening** -- Write-path consistency checks reduce wrong-bucket writes. `memorix_audit_project` scans for misattributed observations and reports them with confidence levels.
116
+ - **Ambiguous-target attribution fix** -- Observations stored during ambiguous project context are now flagged rather than silently written to the wrong bucket.
117
+
118
+ ### Added -- Retention, Cleanup, and Operator Remediation
119
+ - **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.
120
+ - **Retention explainability** -- `memorix_retention action="stale"` shows a full table with per-observation retention explanation (importance, multipliers, effective days, zone, immunity reason).
121
+ - **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.
122
+
123
+ ### Added -- OpenCode Plugin Improvements
124
+ - **`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.
125
+ - **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.
126
+
127
+ ### Fixed
128
+ - **#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`.
129
+ - **#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.
130
+ - **#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.
131
+
132
+ ### Stats
133
+ - **Tests:** 1439 passed | 2 skipped (102 files)
134
+ - **Phases landed:** 11 (provenance -> layered disclosure -> evidence -> verification -> citation-lite -> retrieval tuning -> graph routing -> task-line/secret -> attribution -> retention -> cleanup ergonomics)
135
+
136
+ ---
137
+
5
138
  ## [1.0.5] - 2026-03-24
6
139
 
7
140
  ### Added
@@ -34,44 +167,44 @@ All notable changes to this project will be documented in this file.
34
167
 
35
168
  ---
36
169
 
37
- ## [1.0.4] 2026-03-17
170
+ ## [1.0.4] -- 2026-03-17
38
171
 
39
172
  ### Added
40
- - **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"`.
41
- - **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.
42
- - **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.
43
- - **Structured config model** Added project/user `memorix.yml`, project/user `.env` loading, `memorix init`, and configuration provenance diagnostics in `memorix status`.
44
- - **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.
173
+ - **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"`.
174
+ - **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.
175
+ - **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.
176
+ - **Structured config model** -- Added project/user `memorix.yml`, project/user `.env` loading, `memorix init`, and configuration provenance diagnostics in `memorix status`.
177
+ - **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.
45
178
 
46
179
  ### Changed
47
- - **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.
48
- - **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.
49
- - **Dashboard usage model** `memorix serve-http --port 3211` is now the primary control plane entrypoint when you want HTTP transport, collaboration features, and dashboard access in one place.
180
+ - **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.
181
+ - **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.
182
+ - **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.
50
183
 
51
184
  ### Fixed
52
- - **Project identity drift** Fixed Codex/Windsurf startup issues that produced `local/System32`, IDE-installation-directory identities, or other incorrect local project bindings.
53
- - **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.
54
- - **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.
55
- - **Git Memory quality** Added noise filtering, preserved release/version milestone commits, and implemented `memorix ingest commit --force` as an escape hatch for manual ingestion.
56
- - **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.
57
- - **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.
58
- - **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.
59
- - **CI/publish flow** Restored CI green after type/test regressions and changed npm publishing workflow to manual trigger instead of automatic release publishing.
185
+ - **Project identity drift** -- Fixed Codex/Windsurf startup issues that produced `local/System32`, IDE-installation-directory identities, or other incorrect local project bindings.
186
+ - **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.
187
+ - **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.
188
+ - **Git Memory quality** -- Added noise filtering, preserved release/version milestone commits, and implemented `memorix ingest commit --force` as an escape hatch for manual ingestion.
189
+ - **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.
190
+ - **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.
191
+ - **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.
192
+ - **CI/publish flow** -- Restored CI green after type/test regressions and changed npm publishing workflow to manual trigger instead of automatic release publishing.
60
193
 
61
194
  ### Stats
62
195
  - **Tests:** 879/879 passing across 68 files
63
- - **Runtime modes:** stdio MCP (`memorix serve`), HTTP MCP + dashboard (`memorix serve-http --port 3211`), and standalone dashboard remain supported
196
+ - **Runtime modes:** stdio MCP (`memorix serve`), HTTP MCP + dashboard (`memorix background start` by default, or `memorix serve-http --port 3211` in the foreground), and standalone dashboard remain supported
64
197
 
65
198
  ---
66
199
 
67
- ## [1.0.3] 2026-03-14
200
+ ## [1.0.3] -- 2026-03-14
68
201
 
69
202
  ### Added
70
- - **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.
203
+ - **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.
71
204
  - **Extract**: Automatic fact extraction from narratives, title normalization, entity resolution against Knowledge Graph, observation type verification.
72
205
  - **Resolve**: 4 resolution actions (new/merge/evolve/discard) based on similarity scoring, word overlap, and contradiction detection.
73
206
  - **Evaluate**: Multi-factor knowledge value assessment (type weight, fact density, specificity, causal reasoning, noise detection). Categorizes memories as core/contextual/ephemeral.
74
- - **`memorix_formation_metrics` tool** New MCP tool to query aggregated Formation Pipeline metrics (value scores, resolution actions, extraction rates, processing times).
207
+ - **`memorix_formation_metrics` tool** -- New MCP tool to query aggregated Formation Pipeline metrics (value scores, resolution actions, extraction rates, processing times).
75
208
  - **`getEntityNames()` method** on `KnowledgeGraphManager` for Formation Pipeline entity resolution.
76
209
 
77
210
  ### Stats
@@ -81,56 +214,56 @@ All notable changes to this project will be documented in this file.
81
214
 
82
215
  ---
83
216
 
84
- ## [1.0.2] 2026-03-14
217
+ ## [1.0.2] -- 2026-03-14
85
218
 
86
219
  ### Fixed
87
- - **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`.
88
- - **CI Node.js matrix** Removed Node 18 from CI matrix to match `engines: >=20` in `package.json`.
89
- - **Orama reindex idempotency** `reindexObservations()` now resets the Orama DB before rebuilding, eliminating "document already exists" errors in multi-session scenarios.
90
- - **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/`.
220
+ - **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`.
221
+ - **CI Node.js matrix** -- Removed Node 18 from CI matrix to match `engines: >=20` in `package.json`.
222
+ - **Orama reindex idempotency** -- `reindexObservations()` now resets the Orama DB before rebuilding, eliminating "document already exists" errors in multi-session scenarios.
223
+ - **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/`.
91
224
 
92
225
  ---
93
226
 
94
- ## [1.0.1] 2026-03-14
227
+ ## [1.0.1] -- 2026-03-14
95
228
 
96
229
  ### Fixed
97
- - **OpenCode stdout pollution** Removed all `console.log` / `console.error` from the generated OpenCode plugin template. Hooks now run fully silent. (fixes #15)
98
- - **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)
99
- - **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.
230
+ - **OpenCode stdout pollution** -- Removed all `console.log` / `console.error` from the generated OpenCode plugin template. Hooks now run fully silent. (fixes #15)
231
+ - **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)
232
+ - **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.
100
233
 
101
234
  ### Added
102
- - **`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.
235
+ - **`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.
103
236
 
104
237
  ---
105
238
 
106
- ## [1.0.0] 2026-03-09
239
+ ## [1.0.0] -- 2026-03-09
107
240
 
108
241
  ### 🎉 First Stable Release
109
242
 
110
- Memorix reaches v1.0.0 all major features complete. Future versions will iterate based on AI/agent ecosystem evolution.
243
+ Memorix reaches v1.0.0 -- all major features complete. Future versions will iterate based on AI/agent ecosystem evolution.
111
244
 
112
245
  ### Added
113
- - **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.
114
- - **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.
115
- - **`memorix_transfer` tool** Merged `memorix_export` + `memorix_import` into a single tool with `action: "export" | "import"`.
116
- - **TEAM.md** Multi-agent coordination protocol documentation.
246
+ - **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.
247
+ - **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.
248
+ - **`memorix_transfer` tool** -- Merged `memorix_export` + `memorix_import` into a single tool with `action: "export" | "import"`.
249
+ - **TEAM.md** -- Multi-agent coordination protocol documentation.
117
250
 
118
251
  ### Changed
119
- - **Tool consolidation: 41 22 default tools (-46%)**
120
- - Team tools: 13 individual 4 merged (action parameter pattern)
121
- - Knowledge Graph tools: 9 conditional via `~/.memorix/settings.json` (`{ "knowledgeGraph": true }`)
122
- - Export+Import: 2 1 (`memorix_transfer`)
123
- - **Dashboard Team Panel** Redesigned with Iconify icons, Material Design 3 style. Agent cards, task lists, message panel, file lock panel.
252
+ - **Tool consolidation: 41 -> 22 default tools (-46%)**
253
+ - Team tools: 13 individual -> 4 merged (action parameter pattern)
254
+ - Knowledge Graph tools: 9 -> conditional via `~/.memorix/settings.json` (`{ "knowledgeGraph": true }`)
255
+ - Export+Import: 2 -> 1 (`memorix_transfer`)
256
+ - **Dashboard Team Panel** -- Redesigned with Iconify icons, Material Design 3 style. Agent cards, task lists, message panel, file lock panel.
124
257
  - **README updated** for v1.0.0 stable (EN + 中文).
125
258
 
126
259
  ### Fixed
127
- - **Windows EPERM file lock race condition** Treat EPERM same as EEXIST in file-lock.ts.
128
- - **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.
260
+ - **Windows EPERM file lock race condition** -- Treat EPERM same as EEXIST in file-lock.ts.
261
+ - **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.
129
262
 
130
263
  ### Production Hardening
131
264
  - Cross-session shared team state
132
265
  - Inbox capped at 200 messages with auto-eviction
133
- - Session timeout GC (30min idle auto-close)
266
+ - Session timeout GC (30min idle -> auto-close)
134
267
  - Send to inactive agent rejected
135
268
  - Agent leave releases file locks + clears inbox
136
269
  - Orphaned task rescue when assignee inactive
@@ -141,317 +274,317 @@ Memorix reaches v1.0.0 — all major features complete. Future versions will ite
141
274
  - **Tests:** 753/753 passing across 56 files
142
275
  - **IDE Support:** 10 agents (Cursor, Windsurf, Claude Code, Codex, Copilot, Kiro, Antigravity, OpenCode, Trae, Gemini CLI)
143
276
 
144
- ## [0.12.0] 2026-03-08
277
+ ## [0.12.0] -- 2026-03-08
145
278
 
146
279
  ### Added
147
- - **Intent-Aware Recall** Search understands query intent ("why X?" prioritizes decisions/trade-offs, "how to X?" prioritizes how-it-works).
148
- - **MCP Deadlock Fix** Resolved stdio transport deadlock under high concurrency.
149
- - **Dashboard Dark Theme Fix** Proper dark mode support across all panels.
150
- - **Build Race Condition Fix** Fixed tsup parallel build race condition.
280
+ - **Intent-Aware Recall** -- Search understands query intent ("why X?" prioritizes decisions/trade-offs, "how to X?" prioritizes how-it-works).
281
+ - **MCP Deadlock Fix** -- Resolved stdio transport deadlock under high concurrency.
282
+ - **Dashboard Dark Theme Fix** -- Proper dark mode support across all panels.
283
+ - **Build Race Condition Fix** -- Fixed tsup parallel build race condition.
151
284
 
152
- ## [0.11.0] 2026-03-07
285
+ ## [0.11.0] -- 2026-03-07
153
286
 
154
287
  ### Added
155
- - **Mini-Skills** (`memorix_promote`) Promote observations to permanent skills that auto-inject at session start. Never decay, project-scoped.
156
- - **LLM Quality Engine** Compact-on-write (duplicate detection at write time), narrative compression (~27% token reduction), search reranking (60% queries improved).
157
- - **`memorix_deduplicate` tool** LLM-powered semantic deduplication with dry-run support.
158
- - **`memorix_resolve` tool** Mark completed tasks and fixed bugs as resolved to prevent context pollution.
288
+ - **Mini-Skills** (`memorix_promote`) -- Promote observations to permanent skills that auto-inject at session start. Never decay, project-scoped.
289
+ - **LLM Quality Engine** -- Compact-on-write (duplicate detection at write time), narrative compression (~27% token reduction), search reranking (60% queries improved).
290
+ - **`memorix_deduplicate` tool** -- LLM-powered semantic deduplication with dry-run support.
291
+ - **`memorix_resolve` tool** -- Mark completed tasks and fixed bugs as resolved to prevent context pollution.
159
292
 
160
293
  ### Fixed
161
- - **Retention decay fix** Reclassified `what-changed`/`discovery` to low retention (30d instead of 90d).
294
+ - **Retention decay fix** -- Reclassified `what-changed`/`discovery` to low retention (30d instead of 90d).
162
295
 
163
296
  ### Stats
164
- - **Tests:** 641 674 passing
297
+ - **Tests:** 641 -> 674 passing
165
298
 
166
- ## [0.10.6] 2026-03-06
299
+ ## [0.10.6] -- 2026-03-06
167
300
 
168
301
  ### Fixed
169
302
  - Minor stability improvements.
170
303
 
171
- ## [0.10.5] 2026-03-05
304
+ ## [0.10.5] -- 2026-03-05
172
305
 
173
306
  ### Fixed
174
- - **🔴 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.
175
- - **🔴 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.
176
- - **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 `{}`.
177
- - **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.
178
- - **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.
307
+ - **🔴 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.
308
+ - **🔴 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.
309
+ - **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 `{}`.
310
+ - **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.
311
+ - **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.
179
312
 
180
- ## [0.9.25] 2026-02-28
313
+ ## [0.9.25] -- 2026-02-28
181
314
 
182
315
  ### Fixed
183
- - **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`.
184
- - **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.
185
- - **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.
186
- - **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.
316
+ - **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`.
317
+ - **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.
318
+ - **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.
319
+ - **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.
187
320
 
188
- ## [0.9.18] 2026-02-26
321
+ ## [0.9.18] -- 2026-02-26
189
322
 
190
323
  ### Fixed
191
- - **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.
324
+ - **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.
192
325
 
193
- ## [0.9.17] 2026-02-26
326
+ ## [0.9.17] -- 2026-02-26
194
327
 
195
328
  ### Fixed
196
- - **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.
329
+ - **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.
197
330
 
198
- ## [0.9.16] 2026-02-26
331
+ ## [0.9.16] -- 2026-02-26
199
332
 
200
333
  ### Architecture
201
- - **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.
202
- - **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).
203
- - **Pattern detection = classification only** Pattern detection now only determines observation *type* (decision, error, etc.), not whether to store. Storage decisions are made by policy.
204
- - **Unified `TYPE_EMOJI`** Single exported constant, eliminating 3 duplicated copies across handler and session_start.
334
+ - **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.
335
+ - **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).
336
+ - **Pattern detection = classification only** -- Pattern detection now only determines observation *type* (decision, error, etc.), not whether to store. Storage decisions are made by policy.
337
+ - **Unified `TYPE_EMOJI`** -- Single exported constant, eliminating 3 duplicated copies across handler and session_start.
205
338
 
206
339
  ### Fixed
207
- - **🔴 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`.
208
- - **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.
209
- - **Store-first for commands** Command-category tools now use `store: 'always'` policy with minLength 30 (down from 50-200), capturing more meaningful development activity.
340
+ - **🔴 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`.
341
+ - **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.
342
+ - **Store-first for commands** -- Command-category tools now use `store: 'always'` policy with minLength 30 (down from 50-200), capturing more meaningful development activity.
210
343
 
211
- ## [0.9.15] 2026-02-26
344
+ ## [0.9.15] -- 2026-02-26
212
345
 
213
346
  ### Fixed
214
- - **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.
215
- - **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.
216
- - **PreCompact low-quality spam** PreCompact events stored empty/minimal observations with no meaningful content. Now requires `MIN_STORE_LENGTH` (100 chars) to store.
217
- - **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.
347
+ - **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.
348
+ - **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.
349
+ - **PreCompact low-quality spam** -- PreCompact events stored empty/minimal observations with no meaningful content. Now requires `MIN_STORE_LENGTH` (100 chars) to store.
350
+ - **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.
218
351
 
219
- ## [0.9.14] 2026-02-26
352
+ ## [0.9.14] -- 2026-02-26
220
353
 
221
354
  ### Fixed
222
- - **🔴 Critical: Hooks never auto-store during development** Two root causes:
355
+ - **🔴 Critical: Hooks never auto-store during development** -- Two root causes:
223
356
  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`.
224
357
  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.
225
358
  - **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.
226
359
 
227
360
  ### Added
228
- - **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).
361
+ - **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).
229
362
 
230
- ## [0.9.12] 2026-02-25
363
+ ## [0.9.12] -- 2026-02-25
231
364
 
232
365
  ### Fixed
233
- - **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).
234
- - **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/).
235
- - **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/).
236
- - **Kiro only had 1 event** Was only `file_saved`. Now covers `agent_stop`, `prompt_submit`, and `file_save` events.
366
+ - **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).
367
+ - **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/).
368
+ - **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/).
369
+ - **Kiro only had 1 event** -- Was only `file_saved`. Now covers `agent_stop`, `prompt_submit`, and `file_save` events.
237
370
 
238
371
  ### Added
239
- - **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/).
240
- - **Copilot normalizer** Dedicated `normalizeCopilot()` function with `inferCopilotEvent()` for payload-based event detection (Copilot sends typed payloads without explicit event names).
241
- - **Gemini CLI normalizer** Dedicated `normalizeGemini()` function with event mapping for all 11 Gemini CLI events (`BeforeAgent`, `AfterAgent`, `BeforeTool`, `AfterTool`, `PreCompress`, etc.).
242
- - **Gemini CLI event mappings** Full EVENT_MAP entries for Gemini CLI PascalCase events normalized events.
243
- - **Copilot event mappings** EVENT_MAP entries for Copilot-specific camelCase events (`userPromptSubmitted`, `preToolUse`, `postToolUse`, `errorOccurred`).
372
+ - **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/).
373
+ - **Copilot normalizer** -- Dedicated `normalizeCopilot()` function with `inferCopilotEvent()` for payload-based event detection (Copilot sends typed payloads without explicit event names).
374
+ - **Gemini CLI normalizer** -- Dedicated `normalizeGemini()` function with event mapping for all 11 Gemini CLI events (`BeforeAgent`, `AfterAgent`, `BeforeTool`, `AfterTool`, `PreCompress`, etc.).
375
+ - **Gemini CLI event mappings** -- Full EVENT_MAP entries for Gemini CLI PascalCase events -> normalized events.
376
+ - **Copilot event mappings** -- EVENT_MAP entries for Copilot-specific camelCase events (`userPromptSubmitted`, `preToolUse`, `postToolUse`, `errorOccurred`).
244
377
 
245
- ## [0.9.11] 2026-02-25
378
+ ## [0.9.11] -- 2026-02-25
246
379
 
247
380
  ### Fixed
248
- - **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.
381
+ - **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.
249
382
 
250
- ## [0.9.10] 2026-02-25
383
+ ## [0.9.10] -- 2026-02-25
251
384
 
252
385
  ### Fixed
253
- - **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`.
254
- - **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.
386
+ - **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`.
387
+ - **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.
255
388
 
256
- ## [0.9.9] 2026-02-25
389
+ ## [0.9.9] -- 2026-02-25
257
390
 
258
391
  ### Fixed
259
- - **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.
260
- - **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`).
261
- - **Cursor `session_id` field not read** Normalizer expected `conversation_id` but Cursor sends `session_id`. Now reads both with fallback.
392
+ - **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.
393
+ - **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`).
394
+ - **Cursor `session_id` field not read** -- Normalizer expected `conversation_id` but Cursor sends `session_id`. Now reads both with fallback.
262
395
 
263
- ## [0.9.8] 2026-02-25
396
+ ## [0.9.8] -- 2026-02-25
264
397
 
265
398
  ### Fixed
266
- - **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.
267
- - **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.
399
+ - **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.
400
+ - **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.
268
401
 
269
- ## [0.9.7] 2026-02-25
402
+ ## [0.9.7] -- 2026-02-25
270
403
 
271
404
  ### Fixed
272
- - **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.
273
- - **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.
274
- - **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.
275
- - **Post-tool events too aggressively filtered** Tool events with substantial content (>200 chars) are now stored even without keyword pattern matches.
405
+ - **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.
406
+ - **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.
407
+ - **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.
408
+ - **Post-tool events too aggressively filtered** -- Tool events with substantial content (>200 chars) are now stored even without keyword pattern matches.
276
409
 
277
- ## [0.9.6] 2026-02-25
410
+ ## [0.9.6] -- 2026-02-25
278
411
 
279
412
  ### Fixed
280
- - **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/`).
281
- - **`scope: 'project'` parameter now works** Previously accepted but ignored. Now properly filters search results by the current project's ID via Orama where-clause.
413
+ - **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/`).
414
+ - **`scope: 'project'` parameter now works** -- Previously accepted but ignored. Now properly filters search results by the current project's ID via Orama where-clause.
282
415
 
283
- ## [0.9.5] 2026-02-25
416
+ ## [0.9.5] -- 2026-02-25
284
417
 
285
418
  ### Fixed
286
- - **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.
419
+ - **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.
287
420
 
288
- ## [0.9.4] 2026-02-25
421
+ ## [0.9.4] -- 2026-02-25
289
422
 
290
423
  ### Fixed
291
- - **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).
424
+ - **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).
292
425
 
293
- ## [0.9.3] 2026-02-25
426
+ ## [0.9.3] -- 2026-02-25
294
427
 
295
428
  ### Fixed
296
- - **`memorix_timeline` "not found" bug** Timeline was using unreliable Orama empty-term search. Now uses in-memory observations (same fix pattern as `memorix_detail`).
297
- - **`memorix_retention` "no observations found" bug** Same root cause as timeline. Now uses in-memory observations for reliable document retrieval.
298
- - **`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.
299
- - **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`.
300
- - **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.
429
+ - **`memorix_timeline` "not found" bug** -- Timeline was using unreliable Orama empty-term search. Now uses in-memory observations (same fix pattern as `memorix_detail`).
430
+ - **`memorix_retention` "no observations found" bug** -- Same root cause as timeline. Now uses in-memory observations for reliable document retrieval.
431
+ - **`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.
432
+ - **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`.
433
+ - **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.
301
434
 
302
- ## [0.9.2] 2026-02-25
435
+ ## [0.9.2] -- 2026-02-25
303
436
 
304
437
  ### Fixed
305
- - **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.
306
- - **`findPackageRoot` safety** Walking up from temp/nested directories no longer accidentally selects the home directory as project root.
438
+ - **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.
439
+ - **`findPackageRoot` safety** -- Walking up from temp/nested directories no longer accidentally selects the home directory as project root.
307
440
 
308
441
  ### Changed
309
- - **README rewrite** Complete rewrite of Quick Start section for both EN and 中文 READMEs:
442
+ - **README rewrite** -- Complete rewrite of Quick Start section for both EN and 中文 READMEs:
310
443
  - Two-step install (global install + MCP config) instead of error-prone `npx`
311
444
  - Per-agent config examples (Claude Code, Cursor, Windsurf, etc.)
312
445
  - Troubleshooting table for common errors
313
446
  - AI-friendly: agents reading the README will now configure correctly on first try
314
447
 
315
- ## [0.9.1] 2026-02-25
448
+ ## [0.9.1] -- 2026-02-25
316
449
 
317
450
  ### Fixed
318
- - **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.
451
+ - **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.
319
452
 
320
- ## [0.9.0] 2026-02-24
453
+ ## [0.9.0] -- 2026-02-24
321
454
 
322
455
  ### Added
323
- - **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.
324
- - **Temporal Queries** `memorix_search` now supports `since` and `until` parameters for date range filtering. Example: "What auth decisions did we make last week?"
325
- - **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.
326
- - **Export/Import** Two new tools for team collaboration:
327
- - `memorix_export` Export project observations and sessions as JSON (importable) or Markdown (human-readable for PRs/docs)
328
- - `memorix_import` Import from JSON export, re-assigns IDs, skips duplicate topicKeys
329
- - **Dashboard Sessions Panel** New "Sessions" tab in the web dashboard with timeline view, active/completed counts, agent info, and session summaries. Bilingual (EN/中文).
330
- - **Auto sessionId** `memorix_store` now automatically associates the current active session's ID with stored observations.
331
- - **16 new tests** 8 consolidation + 8 export/import (484 total).
456
+ - **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.
457
+ - **Temporal Queries** -- `memorix_search` now supports `since` and `until` parameters for date range filtering. Example: "What auth decisions did we make last week?"
458
+ - **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.
459
+ - **Export/Import** -- Two new tools for team collaboration:
460
+ - `memorix_export` -- Export project observations and sessions as JSON (importable) or Markdown (human-readable for PRs/docs)
461
+ - `memorix_import` -- Import from JSON export, re-assigns IDs, skips duplicate topicKeys
462
+ - **Dashboard Sessions Panel** -- New "Sessions" tab in the web dashboard with timeline view, active/completed counts, agent info, and session summaries. Bilingual (EN/中文).
463
+ - **Auto sessionId** -- `memorix_store` now automatically associates the current active session's ID with stored observations.
464
+ - **16 new tests** -- 8 consolidation + 8 export/import (484 total).
332
465
 
333
466
  ### Stats
334
- - **MCP Tools:** 20 24 (memorix_consolidate, memorix_export, memorix_import + dashboard sessions API)
467
+ - **MCP Tools:** 20 -> 24 (memorix_consolidate, memorix_export, memorix_import + dashboard sessions API)
335
468
  - **Tests:** 484/484 passing
336
469
 
337
- ## [0.8.0] 2026-02-24
470
+ ## [0.8.0] -- 2026-02-24
338
471
 
339
472
  ### Added
340
- - **Session Lifecycle Management** 3 new MCP tools for cross-session context continuity:
341
- - `memorix_session_start` Start a coding session, auto-inject context from previous sessions (summaries + key observations). Previous active sessions are auto-closed.
342
- - `memorix_session_end` End a session with structured summary (Goal/Discoveries/Accomplished/Files format). Summary is injected into the next session.
343
- - `memorix_session_context` Manually retrieve session history and context (useful after compaction recovery).
344
- - **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.
345
- - **`memorix_suggest_topic_key` tool** Suggests stable topic keys from type + title using family heuristics (`architecture/*`, `bug/*`, `decision/*`, `config/*`, `discovery/*`, `pattern/*`). Supports CJK characters.
346
- - **Session persistence** `sessions.json` with atomic writes and file locking for cross-process safety.
347
- - **Observation fields** `topicKey`, `revisionCount`, `updatedAt`, `sessionId` added to `Observation` interface.
348
- - **30 new tests** 16 session lifecycle tests + 14 topic key upsert tests (468 total).
473
+ - **Session Lifecycle Management** -- 3 new MCP tools for cross-session context continuity:
474
+ - `memorix_session_start` -- Start a coding session, auto-inject context from previous sessions (summaries + key observations). Previous active sessions are auto-closed.
475
+ - `memorix_session_end` -- End a session with structured summary (Goal/Discoveries/Accomplished/Files format). Summary is injected into the next session.
476
+ - `memorix_session_context` -- Manually retrieve session history and context (useful after compaction recovery).
477
+ - **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.
478
+ - **`memorix_suggest_topic_key` tool** -- Suggests stable topic keys from type + title using family heuristics (`architecture/*`, `bug/*`, `decision/*`, `config/*`, `discovery/*`, `pattern/*`). Supports CJK characters.
479
+ - **Session persistence** -- `sessions.json` with atomic writes and file locking for cross-process safety.
480
+ - **Observation fields** -- `topicKey`, `revisionCount`, `updatedAt`, `sessionId` added to `Observation` interface.
481
+ - **30 new tests** -- 16 session lifecycle tests + 14 topic key upsert tests (468 total).
349
482
 
350
483
  ### Improved
351
- - **`storeObservation` API** Now returns `{ observation, upserted }` instead of just `Observation`, enabling callers to distinguish new vs updated observations.
484
+ - **`storeObservation` API** -- Now returns `{ observation, upserted }` instead of just `Observation`, enabling callers to distinguish new vs updated observations.
352
485
 
353
486
  ### Inspired by
354
- - [Engram](https://github.com/alanbuscaglia/engram) Session lifecycle design, topic_key upsert pattern, structured session summaries.
487
+ - [Engram](https://github.com/alanbuscaglia/engram) -- Session lifecycle design, topic_key upsert pattern, structured session summaries.
355
488
 
356
- ## [0.7.11] 2026-02-24
489
+ ## [0.7.11] -- 2026-02-24
357
490
 
358
491
  ### Added
359
- - **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.
360
- - **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.
361
- - **Chinese entity extraction** Entity extractor now recognizes Chinese identifiers in brackets (`「认证模块」`, `【数据库连接】`) and backticks, plus Chinese causal language patterns (因为/所以/由于/导致/决定/采用).
362
- - **Graph-memory bidirectional sync** Dashboard DELETE now cleans up corresponding `[#id]` references from knowledge graph entities. Prevents orphaned data.
492
+ - **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.
493
+ - **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.
494
+ - **Chinese entity extraction** -- Entity extractor now recognizes Chinese identifiers in brackets (`「认证模块」`, `【数据库连接】`) and backticks, plus Chinese causal language patterns (因为/所以/由于/导致/决定/采用).
495
+ - **Graph-memory bidirectional sync** -- Dashboard DELETE now cleans up corresponding `[#id]` references from knowledge graph entities. Prevents orphaned data.
363
496
 
364
497
  ### Improved
365
- - **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).
366
- - **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.
367
- - **Re-read-before-write** `storeObservation` re-reads `observations.json` inside the lock before writing, merging concurrent changes instead of overwriting.
498
+ - **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).
499
+ - **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.
500
+ - **Re-read-before-write** -- `storeObservation` re-reads `observations.json` inside the lock before writing, merging concurrent changes instead of overwriting.
368
501
 
369
- ## [0.7.10] 2026-02-24
502
+ ## [0.7.10] -- 2026-02-24
370
503
 
371
504
  ### Added
372
- - **Chinese README** (`README.zh-CN.md`) Full bilingual documentation with language switcher at the top of both README files.
373
- - **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.
374
- - **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.
505
+ - **Chinese README** (`README.zh-CN.md`) -- Full bilingual documentation with language switcher at the top of both README files.
506
+ - **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.
507
+ - **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.
375
508
 
376
- ## [0.7.9] 2026-02-24
509
+ ## [0.7.9] -- 2026-02-24
377
510
 
378
511
  ### Fixed
379
- - **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.
512
+ - **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.
380
513
 
381
514
  ### Added
382
- - **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.
515
+ - **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.
383
516
 
384
- ## [0.7.8] 2026-02-24
517
+ ## [0.7.8] -- 2026-02-24
385
518
 
386
519
  ### Fixed
387
- - **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.
388
- - **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.
520
+ - **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.
521
+ - **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.
389
522
 
390
523
  ### Added
391
- - **`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" }`.
524
+ - **`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" }`.
392
525
 
393
- ## [0.7.7] 2026-02-24
526
+ ## [0.7.7] -- 2026-02-24
394
527
 
395
528
  ### Fixed
396
- - **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.
397
- - **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.
529
+ - **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.
530
+ - **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.
398
531
 
399
- ## [0.7.6] 2026-02-24
532
+ ## [0.7.6] -- 2026-02-24
400
533
 
401
534
  ### Added
402
- - **`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.
403
- - **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.)
535
+ - **`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.
536
+ - **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.)
404
537
 
405
538
  ### Changed
406
- - **GitHub repo description** Shortened to ~150 chars for optimal og:title/og:description generation
407
- - **GitHub topics** 20 GEO-optimized tags including `cursor-mcp`, `windsurf-mcp`, `claude-code-memory`, `cross-ide-sync`, `context-persistence`, `agent-memory`
408
- - **package.json keywords** Replaced generic tags with IDE-specific MCP entity-linking keywords
409
- - **package.json description** Shortened to under 160 chars for better meta tag generation
410
- - **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
539
+ - **GitHub repo description** -- Shortened to ~150 chars for optimal og:title/og:description generation
540
+ - **GitHub topics** -- 20 GEO-optimized tags including `cursor-mcp`, `windsurf-mcp`, `claude-code-memory`, `cross-ide-sync`, `context-persistence`, `agent-memory`
541
+ - **package.json keywords** -- Replaced generic tags with IDE-specific MCP entity-linking keywords
542
+ - **package.json description** -- Shortened to under 160 chars for better meta tag generation
543
+ - **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
411
544
 
412
- ## [0.7.5] 2026-02-22
545
+ ## [0.7.5] -- 2026-02-22
413
546
 
414
547
  ### Changed
415
- - **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.
416
- - **New `docs/SETUP.md`** Dedicated setup guide with agent-specific config, vector search setup, data storage, and troubleshooting
548
+ - **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.
549
+ - **New `docs/SETUP.md`** -- Dedicated setup guide with agent-specific config, vector search setup, data storage, and troubleshooting
417
550
 
418
- ## [0.7.4] 2026-02-22
551
+ ## [0.7.4] -- 2026-02-22
419
552
 
420
553
  ### Fixed
421
- - **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.
554
+ - **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.
422
555
 
423
- ## [0.7.3] 2026-02-22
556
+ ## [0.7.3] -- 2026-02-22
424
557
 
425
558
  ### Fixed
426
- - **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.
559
+ - **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.
427
560
 
428
- ## [0.7.2] 2026-02-22
561
+ ## [0.7.2] -- 2026-02-22
429
562
 
430
563
  ### Fixed
431
- - **`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)
432
- - **`memorix_rules_sync` missing `kiro` target** Added `kiro` to `RULE_SOURCES` enum so Kiro steering rules can be generated as a sync target
433
- - **VS Code Copilot README config** Separated `.vscode/mcp.json` (workspace) and `settings.json` (global) formats which have different JSON structures
564
+ - **`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)
565
+ - **`memorix_rules_sync` missing `kiro` target** -- Added `kiro` to `RULE_SOURCES` enum so Kiro steering rules can be generated as a sync target
566
+ - **VS Code Copilot README config** -- Separated `.vscode/mcp.json` (workspace) and `settings.json` (global) formats which have different JSON structures
434
567
 
435
- ## [0.7.1] 2026-02-22
568
+ ## [0.7.1] -- 2026-02-22
436
569
 
437
570
  ### Fixed
438
- - **Dashboard checkbox checkmark not visible** Added `position: relative/absolute` to `.obs-checkbox::after` so the ✓ renders correctly in batch select mode
439
- - **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
440
- - **`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
441
- - **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
571
+ - **Dashboard checkbox checkmark not visible** -- Added `position: relative/absolute` to `.obs-checkbox::after` so the ✓ renders correctly in batch select mode
572
+ - **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
573
+ - **`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
574
+ - **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
442
575
 
443
- ## [0.7.0] 2026-02-21
576
+ ## [0.7.0] -- 2026-02-21
444
577
 
445
578
  ### Added
446
579
  - **Memory-Driven Skills Engine** (`memorix_skills` MCP tool):
447
- - `list` Discover all `SKILL.md` files across 7 agent directories
448
- - `generate` Auto-generate project-specific skills from observation patterns (gotchas, decisions, how-it-works)
449
- - `inject` Return full skill content directly to agent context
580
+ - `list` -- Discover all `SKILL.md` files across 7 agent directories
581
+ - `generate` -- Auto-generate project-specific skills from observation patterns (gotchas, decisions, how-it-works)
582
+ - `inject` -- Return full skill content directly to agent context
450
583
  - Intelligent scoring: requires skill-worthy observation types, not just volume
451
584
  - Write to any target agent with `write: true, target: "<agent>"`
452
585
  - **Transformers.js Embedding Provider**:
453
- - Pure JavaScript fallback (`@huggingface/transformers`) no native deps required
454
- - Provider chain: `fastembed` `transformers.js` fulltext-only
586
+ - Pure JavaScript fallback (`@huggingface/transformers`) -- no native deps required
587
+ - Provider chain: `fastembed` -> `transformers.js` -> fulltext-only
455
588
  - Quantized model (`q8`) for small footprint
456
589
  - **Dashboard Enhancements**:
457
590
  - Canvas donut chart for observation type distribution
@@ -460,14 +593,14 @@ Memorix reaches v1.0.0 — all major features complete. Future versions will ite
460
593
  - **17 new tests** for Skills Engine (list, generate, inject, write, scoring, dedup)
461
594
 
462
595
  ### Changed
463
- - 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
464
- - Volume bonus reduced from 2×obs to 1×obs (capped at 5) to favor quality over quantity
596
+ - 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
597
+ - Volume bonus reduced from 2xobs to 1xobs (capped at 5) to favor quality over quantity
465
598
  - Type diversity bonus increased from 2 to 3 points per unique skill-worthy type
466
599
 
467
600
  ### Fixed
468
601
  - 422 tests passing (up from 405), 34 test files, zero regressions
469
602
 
470
- ## [0.5.0] 2026-02-15
603
+ ## [0.5.0] -- 2026-02-15
471
604
 
472
605
  ### Added
473
606
  - **Antigravity Adapter**: Full support for Antigravity/Gemini IDE (MCP config + rules)
@@ -484,11 +617,11 @@ Memorix reaches v1.0.0 — all major features complete. Future versions will ite
484
617
  ### Fixed
485
618
  - 274 tests passing (up from 219), zero regressions
486
619
 
487
- ## [0.1.0] 2026-02-14
620
+ ## [0.1.0] -- 2026-02-14
488
621
 
489
622
  ### Core
490
623
  - Knowledge Graph: Entity-Relation-Observation model (MCP Official compatible)
491
- - 3-Layer Progressive Disclosure: compact search timeline detail
624
+ - 3-Layer Progressive Disclosure: compact search -> timeline -> detail
492
625
  - 9 observation types with icon classification
493
626
  - Full-text search via Orama (BM25)
494
627
  - Per-project isolation via Git remote detection
@@ -496,7 +629,7 @@ Memorix reaches v1.0.0 — all major features complete. Future versions will ite
496
629
 
497
630
  ### Cross-Agent Sync
498
631
  - Rules Parser: 4 format adapters (Cursor, Claude Code, Codex, Windsurf)
499
- - Rules Syncer: scan deduplicate conflict detection cross-format generation
632
+ - Rules Syncer: scan -> deduplicate -> conflict detection -> cross-format generation
500
633
  - Workspace Sync: MCP config migration + workflow sync + apply with backup/rollback
501
634
 
502
635
  ### Intelligence (Competitor-Inspired)
@@ -513,7 +646,7 @@ Memorix reaches v1.0.0 — all major features complete. Future versions will ite
513
646
  - Embedding provider abstraction layer (extensible)
514
647
  - fastembed integration (optional, local ONNX, 384-dim bge-small)
515
648
  - Orama hybrid search mode (BM25 + vector)
516
- - Graceful degradation: no fastembed fulltext only
649
+ - Graceful degradation: no fastembed -> fulltext only
517
650
  - Embedding cache (5000 entries LRU)
518
651
 
519
652
  ### Agent Instructions