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