memorix 1.2.0 → 1.2.2

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.
Files changed (212) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/README.md +18 -4
  3. package/README.zh-CN.md +18 -4
  4. package/TEAM.md +86 -86
  5. package/dist/cli/index.js +15919 -14055
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/index.js +1997 -1021
  8. package/dist/index.js.map +1 -1
  9. package/dist/maintenance-runner.d.ts +1 -1
  10. package/dist/maintenance-runner.js +8481 -8005
  11. package/dist/maintenance-runner.js.map +1 -1
  12. package/dist/memcode-runtime/CHANGELOG.md +30 -1
  13. package/dist/sdk.d.ts +7 -2
  14. package/dist/sdk.js +2022 -1024
  15. package/dist/sdk.js.map +1 -1
  16. package/dist/types.d.ts +49 -1
  17. package/dist/types.js.map +1 -1
  18. package/docs/1.2.2-MEMORY-CONTROL-PLANE.md +434 -0
  19. package/docs/AGENT_OPERATOR_PLAYBOOK.md +4 -0
  20. package/docs/API_REFERENCE.md +27 -5
  21. package/docs/DESIGN_DECISIONS.md +357 -357
  22. package/docs/DEVELOPMENT.md +4 -0
  23. package/docs/README.md +1 -1
  24. package/docs/SETUP.md +7 -1
  25. package/docs/dev-log/progress.txt +91 -11
  26. package/docs/knowledge/workflows/memorix-release.md +57 -0
  27. package/package.json +1 -1
  28. package/plugins/codex/memorix/.codex-plugin/plugin.json +1 -1
  29. package/src/audit/index.ts +156 -156
  30. package/src/cli/command-guide.ts +192 -0
  31. package/src/cli/commands/audit-list.ts +89 -89
  32. package/src/cli/commands/audit.ts +9 -4
  33. package/src/cli/commands/background.ts +659 -659
  34. package/src/cli/commands/cleanup.ts +5 -1
  35. package/src/cli/commands/codegraph.ts +17 -8
  36. package/src/cli/commands/context.ts +3 -2
  37. package/src/cli/commands/doctor.ts +4 -2
  38. package/src/cli/commands/explain.ts +9 -3
  39. package/src/cli/commands/formation.ts +48 -48
  40. package/src/cli/commands/git-hook-install.ts +111 -111
  41. package/src/cli/commands/handoff.ts +75 -61
  42. package/src/cli/commands/hooks-status.ts +63 -63
  43. package/src/cli/commands/identity.ts +116 -0
  44. package/src/cli/commands/ingest-commit.ts +153 -153
  45. package/src/cli/commands/ingest-image.ts +71 -69
  46. package/src/cli/commands/ingest-log.ts +180 -180
  47. package/src/cli/commands/ingest.ts +44 -44
  48. package/src/cli/commands/integrate-shared.ts +15 -15
  49. package/src/cli/commands/knowledge.ts +40 -0
  50. package/src/cli/commands/lock.ts +93 -92
  51. package/src/cli/commands/memory.ts +58 -21
  52. package/src/cli/commands/message.ts +123 -118
  53. package/src/cli/commands/operator-shared.ts +98 -3
  54. package/src/cli/commands/poll.ts +74 -64
  55. package/src/cli/commands/purge-all-memory.ts +85 -85
  56. package/src/cli/commands/purge-project-memory.ts +83 -83
  57. package/src/cli/commands/reasoning.ts +135 -121
  58. package/src/cli/commands/retention.ts +9 -4
  59. package/src/cli/commands/serve-http.ts +22 -43
  60. package/src/cli/commands/serve-shared.ts +118 -118
  61. package/src/cli/commands/session.ts +29 -3
  62. package/src/cli/commands/setup.ts +9 -3
  63. package/src/cli/commands/skills.ts +124 -119
  64. package/src/cli/commands/status.ts +4 -3
  65. package/src/cli/commands/task.ts +193 -184
  66. package/src/cli/commands/team.ts +14 -10
  67. package/src/cli/commands/transfer.ts +108 -55
  68. package/src/cli/commands/uninstall-project-artifacts.ts +85 -85
  69. package/src/cli/identity.ts +89 -0
  70. package/src/cli/index.ts +96 -19
  71. package/src/cli/invocation.ts +115 -0
  72. package/src/cli/tui/ChatView.tsx +234 -234
  73. package/src/cli/tui/CommandBar.tsx +312 -312
  74. package/src/cli/tui/ContextRail.tsx +118 -118
  75. package/src/cli/tui/HeaderBar.tsx +72 -72
  76. package/src/cli/tui/LogoBanner.tsx +51 -51
  77. package/src/cli/tui/Sidebar.tsx +179 -179
  78. package/src/cli/tui/chat-service.ts +41 -18
  79. package/src/cli/tui/data.ts +23 -44
  80. package/src/cli/tui/index.ts +41 -41
  81. package/src/cli/tui/markdown-render.tsx +371 -371
  82. package/src/cli/tui/operator-context.ts +60 -0
  83. package/src/cli/tui/use-mouse.ts +157 -157
  84. package/src/cli/tui/useNavigation.ts +56 -56
  85. package/src/cli/tui/views/MemoryView.tsx +10 -8
  86. package/src/cli/update-checker.ts +211 -211
  87. package/src/cli/version.ts +7 -7
  88. package/src/cli/workbench.ts +1 -1
  89. package/src/codegraph/auto-context.ts +34 -17
  90. package/src/codegraph/context-pack.ts +1 -0
  91. package/src/codegraph/current-facts.ts +19 -1
  92. package/src/codegraph/project-context.ts +2 -0
  93. package/src/codegraph/task-lens.ts +49 -5
  94. package/src/compact/engine.ts +26 -10
  95. package/src/compact/index-format.ts +25 -2
  96. package/src/compact/token-budget.ts +74 -74
  97. package/src/dashboard/project-classification.ts +64 -64
  98. package/src/dashboard/server.ts +58 -52
  99. package/src/embedding/fastembed-provider.ts +142 -142
  100. package/src/embedding/transformers-provider.ts +111 -111
  101. package/src/git/extractor.ts +209 -209
  102. package/src/git/hooks-path.ts +85 -85
  103. package/src/hooks/admission.ts +117 -0
  104. package/src/hooks/handler.ts +98 -91
  105. package/src/hooks/pattern-detector.ts +173 -173
  106. package/src/hooks/significance-filter.ts +250 -250
  107. package/src/knowledge/claims.ts +51 -1
  108. package/src/knowledge/context-assembly.ts +97 -0
  109. package/src/knowledge/types.ts +1 -0
  110. package/src/knowledge/workflows.ts +34 -3
  111. package/src/knowledge/workset.ts +179 -10
  112. package/src/llm/memory-manager.ts +328 -328
  113. package/src/llm/provider.ts +885 -885
  114. package/src/llm/quality.ts +248 -248
  115. package/src/memory/admission.ts +57 -0
  116. package/src/memory/attribution-guard.ts +249 -249
  117. package/src/memory/auto-relations.ts +21 -0
  118. package/src/memory/consolidation.ts +13 -2
  119. package/src/memory/disclosure-policy.ts +140 -135
  120. package/src/memory/entity-extractor.ts +197 -197
  121. package/src/memory/export-import.ts +11 -3
  122. package/src/memory/formation/evaluate.ts +217 -217
  123. package/src/memory/formation/extract.ts +361 -361
  124. package/src/memory/formation/index.ts +417 -417
  125. package/src/memory/formation/resolve.ts +344 -344
  126. package/src/memory/formation/types.ts +315 -315
  127. package/src/memory/freshness.ts +122 -122
  128. package/src/memory/graph-context.ts +8 -2
  129. package/src/memory/graph-scope.ts +46 -0
  130. package/src/memory/graph.ts +197 -197
  131. package/src/memory/observations.ts +162 -4
  132. package/src/memory/quality-audit.ts +2 -0
  133. package/src/memory/refs.ts +94 -94
  134. package/src/memory/retention.ts +22 -2
  135. package/src/memory/secret-filter.ts +79 -79
  136. package/src/memory/session.ts +5 -2
  137. package/src/memory/visibility.ts +80 -0
  138. package/src/multimodal/image-loader.ts +143 -143
  139. package/src/orchestrate/adapters/claude-stream.ts +192 -192
  140. package/src/orchestrate/adapters/claude.ts +111 -111
  141. package/src/orchestrate/adapters/codex-stream.ts +134 -134
  142. package/src/orchestrate/adapters/codex.ts +41 -41
  143. package/src/orchestrate/adapters/gemini-stream.ts +166 -166
  144. package/src/orchestrate/adapters/gemini.ts +42 -42
  145. package/src/orchestrate/adapters/index.ts +73 -73
  146. package/src/orchestrate/adapters/opencode-stream.ts +143 -143
  147. package/src/orchestrate/adapters/opencode.ts +47 -47
  148. package/src/orchestrate/adapters/spawn-helper.ts +286 -286
  149. package/src/orchestrate/adapters/types.ts +77 -77
  150. package/src/orchestrate/capability-router.ts +284 -284
  151. package/src/orchestrate/context-compact.ts +188 -188
  152. package/src/orchestrate/cost-tracker.ts +219 -219
  153. package/src/orchestrate/error-recovery.ts +191 -191
  154. package/src/orchestrate/evidence.ts +140 -140
  155. package/src/orchestrate/ledger.ts +110 -110
  156. package/src/orchestrate/memorix-bridge.ts +378 -340
  157. package/src/orchestrate/output-budget.ts +80 -80
  158. package/src/orchestrate/permission.ts +152 -152
  159. package/src/orchestrate/pipeline-trace.ts +131 -131
  160. package/src/orchestrate/prompt-builder.ts +155 -155
  161. package/src/orchestrate/ring-buffer.ts +37 -37
  162. package/src/orchestrate/task-graph.ts +389 -389
  163. package/src/orchestrate/verify-gate.ts +33 -10
  164. package/src/orchestrate/worktree.ts +232 -232
  165. package/src/project/aliases.ts +374 -374
  166. package/src/project/detector.ts +268 -268
  167. package/src/rules/adapters/claude-code.ts +99 -99
  168. package/src/rules/adapters/codex.ts +97 -97
  169. package/src/rules/adapters/copilot.ts +124 -124
  170. package/src/rules/adapters/cursor.ts +114 -114
  171. package/src/rules/adapters/kiro.ts +126 -126
  172. package/src/rules/adapters/trae.ts +56 -56
  173. package/src/rules/adapters/windsurf.ts +83 -83
  174. package/src/rules/syncer.ts +235 -235
  175. package/src/runtime/control-plane-maintenance.ts +1 -0
  176. package/src/runtime/isolated-maintenance.ts +1 -0
  177. package/src/runtime/lifecycle.ts +18 -0
  178. package/src/runtime/maintenance-jobs.ts +1 -0
  179. package/src/runtime/maintenance-runner.ts +2 -0
  180. package/src/runtime/project-maintenance.ts +89 -0
  181. package/src/sdk.ts +334 -304
  182. package/src/search/intent-detector.ts +289 -289
  183. package/src/search/query-expansion.ts +52 -52
  184. package/src/server/formation-timeout.ts +27 -27
  185. package/src/server.ts +334 -93
  186. package/src/skills/mini-skills.ts +386 -386
  187. package/src/store/chat-store.ts +119 -119
  188. package/src/store/graph-store.ts +249 -249
  189. package/src/store/mini-skill-store.ts +349 -349
  190. package/src/store/orama-store.ts +61 -6
  191. package/src/store/persistence-json.ts +212 -212
  192. package/src/store/persistence.ts +291 -291
  193. package/src/store/project-affinity.ts +195 -195
  194. package/src/store/sqlite-db.ts +23 -1
  195. package/src/store/sqlite-store.ts +12 -2
  196. package/src/team/event-bus.ts +76 -76
  197. package/src/team/file-locks.ts +173 -173
  198. package/src/team/handoff.ts +168 -161
  199. package/src/team/messages.ts +203 -203
  200. package/src/team/poll.ts +132 -132
  201. package/src/team/tasks.ts +211 -211
  202. package/src/types.ts +51 -0
  203. package/src/wiki/generator.ts +2 -0
  204. package/src/workspace/mcp-adapters/codex.ts +191 -191
  205. package/src/workspace/mcp-adapters/copilot.ts +105 -105
  206. package/src/workspace/mcp-adapters/cursor.ts +53 -53
  207. package/src/workspace/mcp-adapters/kiro.ts +64 -64
  208. package/src/workspace/mcp-adapters/opencode.ts +123 -123
  209. package/src/workspace/mcp-adapters/trae.ts +134 -134
  210. package/src/workspace/mcp-adapters/windsurf.ts +91 -91
  211. package/src/workspace/sanitizer.ts +60 -60
  212. package/src/workspace/workflow-sync.ts +131 -131
@@ -271,6 +271,10 @@ to make sure provenance diagnostics match runtime behavior.
271
271
 
272
272
  ## 9. Release Workflow
273
273
 
274
+ The repository's canonical workflow is [Memorix release](knowledge/workflows/memorix-release.md).
275
+ It is the versioned source for agents and maintainers; its checks supplement,
276
+ rather than replace, the explicit maintainer approval required to publish.
277
+
274
278
  Recommended release flow:
275
279
 
276
280
  1. update docs and version metadata
package/docs/README.md CHANGED
@@ -87,7 +87,7 @@ The public docs are organized by user intent:
87
87
  | 1.2 task-shaped evidence selection | [1.2 Workset Retrieval](1.2.0-WORKSET-RETRIEVAL.md) |
88
88
  | 1.2 non-blocking refresh and maintenance contract | [1.2 Dynamic Lifecycle](1.2.0-DYNAMIC-LIFECYCLE.md) |
89
89
  | 1.2 honest Lite and optional semantic CodeGraph provider contract | [1.2 Provider Quality](1.2.0-PROVIDER-QUALITY.md) |
90
- | Active 1.2 multi-dimensional memory work | [1.2.0 Development Charter](1.2.0-DEVELOPMENT-CHARTER.md) |
90
+ | Active context-control work | [1.2.2 Memory Control Plane](1.2.2-MEMORY-CONTROL-PLANE.md) |
91
91
  | Historical cloud sync and multi-agent research | [CLOUD_SYNC_AND_MULTI_AGENT_RESEARCH.md](CLOUD_SYNC_AND_MULTI_AGENT_RESEARCH.md) |
92
92
  | Known issues and old roadmap notes | [KNOWN_ISSUES_AND_ROADMAP.md](KNOWN_ISSUES_AND_ROADMAP.md) |
93
93
 
package/docs/SETUP.md CHANGED
@@ -276,12 +276,18 @@ Manual stdio shape:
276
276
  "mcpServers": {
277
277
  "memorix": {
278
278
  "command": "memorix",
279
- "args": ["serve"]
279
+ "args": ["serve"],
280
+ "alwaysLoad": true
280
281
  }
281
282
  }
282
283
  }
283
284
  ```
284
285
 
286
+ Keep `alwaysLoad: true` for a manually managed Claude Code entry so its small
287
+ Memorix tool set is available during print-mode startup. `memorix doctor agents
288
+ --agent claude` reports a missing eager-load setting, and `memorix repair agents
289
+ --agent claude` restores it without replacing unrelated MCP servers.
290
+
285
291
  ### Cursor
286
292
 
287
293
  Project config: `.cursor/mcp.json`
@@ -4,15 +4,15 @@
4
4
  > older notes when they conflict.
5
5
 
6
6
  ## Current State
7
- - Phase: 1.2 release validation and publication
8
- - Branch: `codex/1.2.0-multidimensional-memory`
9
- - Last updated: 2026-07-18
10
- - Released baseline: `memorix@1.1.13`, tag `v1.1.13`, PR #129 merged as
11
- `7e8077f`.
12
- - Goal: turn Memorix from a useful narrative-memory layer into a task-ready
13
- working-context layer where code state, change evidence, verification,
14
- source-backed project knowledge, workflows, and durable decisions are ranked
15
- together.
7
+ - Phase: 1.2.2 memory-control-plane admission and visibility implementation
8
+ - Branch: `codex/1.2.2-memory-control-plane`
9
+ - Last updated: 2026-07-25
10
+ - Released baseline: `memorix@1.2.1`, tag `v1.2.1`, `origin/main` at
11
+ `1b5bf7f`.
12
+ - Goal: make the 1.2 multi-dimensional evidence layer behave as one bounded,
13
+ explainable control plane. A task Workset, hook handoff, lifecycle refresh,
14
+ and provider capability result must share evidence qualification, delivery
15
+ budgets, and privacy-safe receipts.
16
16
 
17
17
  ## 1.1.13 Closeout
18
18
  - Codex setup now stamps plugin versions and doctor distinguishes bundle,
@@ -102,7 +102,7 @@
102
102
  - The compiled CLI was smoke-tested in an isolated Git project through init,
103
103
  compile, apply, and lint with a source-backed claim.
104
104
 
105
- ## 1.2 Delivery Complete, Release Checks In Progress
105
+ ## 1.2 Delivery Complete, Released As 1.2.1
106
106
  - Phase 4 added canonical Markdown workflows, safe adapter preview/apply, import,
107
107
  selection, and verification receipts. Agent instruction files are render
108
108
  targets, not the workflow source of truth.
@@ -123,4 +123,84 @@
123
123
  - Release audit also incorporated #130 before publication: the optional SQLite
124
124
  runtime now uses the Node-26-compatible `better-sqlite3` 12.x line, with a
125
125
  dedicated Node 26 CI smoke that opens an in-memory database.
126
- - Remaining remote gates: GitHub CI, npm publish, tag, and GitHub release.
126
+ - The release was completed as `memorix@1.2.1`. Its next development line is
127
+ [1.2.2 Memory Control Plane](../1.2.2-MEMORY-CONTROL-PLANE.md), which
128
+ consolidates these capabilities instead of adding another disconnected
129
+ memory feature.
130
+
131
+ ## 1.2.2 Control Plane
132
+ - `TaskWorkset` already has bounded rendering and source-aware claims, but
133
+ SessionStart handoff and legacy context surfaces need one shared admission,
134
+ budget, and receipt contract.
135
+ - First implementation slice complete: the shared `ContextReceipt` records
136
+ delivery target, selected source ids/kinds, trust/freshness, exact budget
137
+ omissions, queued refreshes, and Workset selection time without entering the
138
+ agent prompt. Project Context, Context Pack, and full SessionStart injection
139
+ now carry the same delivery-target semantics; `memorix explain` exposes the
140
+ receipt in text and JSON.
141
+ - Budget selection now keeps a knowledge page dependent on a Claim out of the
142
+ prompt when its qualifying Claim could not fit. The receipt records both as
143
+ withheld instead of presenting an orphaned page path as usable knowledge.
144
+ - Phase 3 admission slice complete: automatic observations now persist an
145
+ `ephemeral`, `candidate`, or `qualified` state and a reason. Hooks and the
146
+ internal orchestrator capture concrete evidence as candidates, keep routine
147
+ success/telemetry ephemeral, and drop low-signal activity without writing it.
148
+ Automatic capture stays quiet in the host agent.
149
+ - A deduplicated `observation-qualify` maintenance job runs after CodeGraph
150
+ refresh. It requires a scan no older than the capture and at least one
151
+ current code reference before upgrading a candidate. Qualification does not
152
+ create a Claim; explicit saves and Git remain the Claim boundary.
153
+ - Auto Project Context, automatic session L1 delivery, Wiki/Knowledge Graph
154
+ compilation, and graph-context packets exclude candidates and ephemeral
155
+ traces. Ordinary search prefers qualified material, while explicit lookup
156
+ can still inspect pending evidence.
157
+ - Pending automatic evidence is also excluded from automatic consolidation so
158
+ a later qualification can still inspect its original source grain. Retention
159
+ explanations no longer describe an unqualified `core` candidate as immune.
160
+ - Actor and visibility enforcement is now one policy shared by MCP retrieval,
161
+ auto context, CLI/TUI, dashboards, knowledge/graph projections, and scoped
162
+ maintenance. Legacy observations remain project-visible; new records may be
163
+ `project`, `team`, or `personal` with an explicit creator and recipients.
164
+ Missing identity never grants private or team visibility.
165
+ - Automatic hooks and orchestrator traces begin personal. A verified hook
166
+ candidate may become project evidence only when qualification proves a
167
+ current code reference. Targeted handoffs are readable by sender and
168
+ recipient but writable only by sender; broadcasts require an active project
169
+ team member.
170
+ - Automatic orchestration lesson lookup is explicitly project-scoped, so its
171
+ prompt injection cannot read personal or team-scoped records.
172
+ - Topic-key writes now check mutation scope before storage, and the
173
+ project-attribution guard receives only memories visible to its current
174
+ reader. This closes both guessed-key overwrite and cross-project existence
175
+ hints without hiding historical project knowledge after upgrade.
176
+ - The embedded SDK remains project-visible when unbound. CLI and the local TUI
177
+ now share the same explicit actor reader: an unbound terminal sees project
178
+ memory only, while `memorix identity join|use` (or one-shot `--as`) grants
179
+ only that active project member's personal/team visibility and coordination
180
+ ergonomics. `identity clear` returns to project scope; private evidence
181
+ cannot be promoted into shared skills or generated project skills.
182
+ - CLI control-plane ergonomics now include `--cwd`, kebab-case flag aliases,
183
+ action-oriented namespace help, explicit `memorix workbench`, and
184
+ file/stdin transfer import/export. Root memory aliases use the same
185
+ canonical command paths as `memorix memory`; CLI and MCP exports are filtered
186
+ by the same active reader so an unbound backup cannot contain private/team
187
+ observations.
188
+ - Direct CLI and foreground Code Memory refreshes now enqueue qualification as
189
+ well as claim requalification, and they register the local project target
190
+ needed by the isolated control-plane worker. The host hook path persists its
191
+ candidate before scheduling a refresh, avoiding a fast-worker race where a
192
+ scan could predate the capture.
193
+ - Compiled-artifact smoke: an isolated Codex `PostToolUse` hook returned only
194
+ `continue: true`, stored a `candidate`, and the isolated background control
195
+ plane upgraded it to `qualified` after a real Code Memory scan with one
196
+ current reference. Embeddings were deliberately disabled for this
197
+ deterministic local smoke. The full test suite, TypeScript check, and
198
+ production build also passed after the admission policy was reconciled with
199
+ OpenCode's concise technical response events.
200
+ - #135 remains a contributor-owned session-handoff candidate for the bounded
201
+ `HandoffPacket` phase. It is not copied or silently replaced.
202
+ - #133/#134 remain open pending an official provider-capability layer and a
203
+ safe agent-facing media path. The existing OpenRouter text embedding path is
204
+ the supported baseline.
205
+ - See [1.2.2 Memory Control Plane](../1.2.2-MEMORY-CONTROL-PLANE.md) for
206
+ phases, acceptance gates, non-goals, and release criteria.
@@ -0,0 +1,57 @@
1
+ ---
2
+ id: memorix-release
3
+ title: Memorix release
4
+ description: Prepare a Memorix release with evidence, package verification, and explicit maintainer approval.
5
+ status: active
6
+ version: 1
7
+ taskLenses: [release]
8
+ triggers: [release, publish, npm, version, changelog]
9
+ allowedAgents: [codex, claude-code, cursor, windsurf, copilot, antigravity, gemini-cli, openclaw, hermes, omp, kiro, opencode, trae]
10
+ verificationGates:
11
+ - Version and changelog match the release scope
12
+ - npm run lint passes
13
+ - npm run build passes
14
+ - npm test passes
15
+ - Focused live MCP smoke passes when server behavior changed
16
+ - Package smoke passes
17
+ - CI passes on the release commit
18
+ - Maintainer approval is explicit before publishing
19
+ ---
20
+
21
+ ## Inspect
22
+
23
+ Read the current version, changelog, Git state, open release risks, and the
24
+ diff that will ship. Do not treat a release tag, an old test run, or a local
25
+ token as proof that this exact commit is ready.
26
+
27
+ ## Prepare
28
+
29
+ Update version metadata, changelog, and user-facing documentation only for
30
+ changes that are actually included. Keep package workspace visibility and npm
31
+ access settings unchanged unless the release specifically changes them.
32
+
33
+ ## Verify
34
+
35
+ Run `npm run lint`, `npm run build`, and `npm test`. Run focused tests for the
36
+ changed surface. When MCP behavior changed, use a real isolated stdio client to
37
+ exercise the affected tool path. Inspect `npm pack --dry-run --json` and run a
38
+ package smoke from the packed artifact when packaging changed.
39
+
40
+ ## Review
41
+
42
+ Record what passed, what was not run, and any remaining risk. Confirm that the
43
+ release commit has passing CI. A workflow may prepare evidence, but publishing
44
+ requires explicit maintainer approval.
45
+
46
+ ## Publish
47
+
48
+ After explicit maintainer approval, publish through the approved release path.
49
+ Never put credentials in the repository, release notes, workflow files, or
50
+ command output. Verify the published package version without exposing tokens.
51
+
52
+ ## Follow Up
53
+
54
+ Check a fresh install or `npx` invocation, create or update the GitHub release
55
+ if appropriate, and reply to affected issue reporters with the concrete fix and
56
+ version. Store the verification evidence as project knowledge rather than an
57
+ unstructured chat note.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memorix",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "Local-first shared memory layer for AI coding agents across MCP clients, Git history, reasoning context, and project sessions.",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "memorix",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "Shared workspace memory for Codex and other AI coding agents.",
5
5
  "author": {
6
6
  "name": "AVIDS2",
@@ -1,156 +1,156 @@
1
- /**
2
- * Audit Module - Track Memorix-written files
3
- *
4
- * Records all files written by Memorix to distinguish them from
5
- * project-native files. Provides audit trail for cleanup and rollback.
6
- */
7
-
8
- import * as fs from 'node:fs/promises';
9
- import * as path from 'node:path';
10
- import { homedir } from 'node:os';
11
-
12
- function getAuditFilePath(): string {
13
- return process.env.MEMORIX_AUDIT_FILE || path.join(homedir(), '.memorix', 'audit.json');
14
- }
15
-
16
- export interface AuditEntry {
17
- type: 'hook' | 'rule' | 'other';
18
- agent?: string;
19
- path: string;
20
- createdAt: string;
21
- }
22
-
23
- export interface ProjectAudit {
24
- projectRoot: string;
25
- installedAt: string;
26
- entries: AuditEntry[];
27
- }
28
-
29
- export interface AuditData {
30
- version: string;
31
- projects: Record<string, ProjectAudit>;
32
- }
33
-
34
- /**
35
- * Load audit data from disk.
36
- */
37
- export async function loadAudit(): Promise<AuditData> {
38
- try {
39
- const content = await fs.readFile(getAuditFilePath(), 'utf-8');
40
- return JSON.parse(content) as AuditData;
41
- } catch {
42
- // No audit file yet
43
- return {
44
- version: '1.0.0',
45
- projects: {},
46
- };
47
- }
48
- }
49
-
50
- /**
51
- * Save audit data to disk.
52
- */
53
- export async function saveAudit(data: AuditData): Promise<void> {
54
- const auditFile = getAuditFilePath();
55
- const dir = path.dirname(auditFile);
56
- await fs.mkdir(dir, { recursive: true });
57
- await fs.writeFile(auditFile, JSON.stringify(data, null, 2), 'utf-8');
58
- }
59
-
60
- /**
61
- * Get project ID from project root via .git detection.
62
- */
63
- export function getProjectId(projectRoot: string): string {
64
- try {
65
- const { detectProject } = require('../project/detector.js');
66
- const project = detectProject(projectRoot);
67
- if (project) return project.id;
68
- } catch { /* fallback below */ }
69
- const normalized = projectRoot.replace(/\\/g, '/');
70
- return `untracked/${normalized}`;
71
- }
72
-
73
- /**
74
- * Record a file written by Memorix.
75
- */
76
- export async function recordFile(
77
- projectRoot: string,
78
- type: AuditEntry['type'],
79
- filePath: string,
80
- agent?: string,
81
- ): Promise<void> {
82
- const data = await loadAudit();
83
- const projectId = getProjectId(projectRoot);
84
-
85
- if (!data.projects[projectId]) {
86
- data.projects[projectId] = {
87
- projectRoot,
88
- installedAt: new Date().toISOString(),
89
- entries: [],
90
- };
91
- }
92
-
93
- // Check if entry already exists
94
- const existingIndex = data.projects[projectId].entries.findIndex(
95
- (e) => e.path === filePath
96
- );
97
-
98
- if (existingIndex === -1) {
99
- data.projects[projectId].entries.push({
100
- type,
101
- agent,
102
- path: filePath,
103
- createdAt: new Date().toISOString(),
104
- });
105
- }
106
-
107
- await saveAudit(data);
108
- }
109
-
110
- /**
111
- * Get all files written by Memorix for a project.
112
- */
113
- export async function getProjectFiles(projectRoot: string): Promise<AuditEntry[]> {
114
- const data = await loadAudit();
115
- const projectId = getProjectId(projectRoot);
116
- return data.projects[projectId]?.entries || [];
117
- }
118
-
119
- /**
120
- * Remove a file from audit (when uninstalled).
121
- */
122
- export async function removeFile(projectRoot: string, filePath: string): Promise<void> {
123
- const data = await loadAudit();
124
- const projectId = getProjectId(projectRoot);
125
-
126
- if (!data.projects[projectId]) return;
127
-
128
- data.projects[projectId].entries = data.projects[projectId].entries.filter(
129
- (e) => e.path !== filePath
130
- );
131
-
132
- // If no entries left, remove the project
133
- if (data.projects[projectId].entries.length === 0) {
134
- delete data.projects[projectId];
135
- }
136
-
137
- await saveAudit(data);
138
- }
139
-
140
- /**
141
- * Get all audit entries across all projects.
142
- */
143
- export async function getAllAuditEntries(): Promise<
144
- Array<{ projectId: string; entry: AuditEntry }>
145
- > {
146
- const data = await loadAudit();
147
- const entries: Array<{ projectId: string; entry: AuditEntry }> = [];
148
-
149
- for (const [projectId, project] of Object.entries(data.projects)) {
150
- for (const entry of project.entries) {
151
- entries.push({ projectId, entry });
152
- }
153
- }
154
-
155
- return entries;
156
- }
1
+ /**
2
+ * Audit Module - Track Memorix-written files
3
+ *
4
+ * Records all files written by Memorix to distinguish them from
5
+ * project-native files. Provides audit trail for cleanup and rollback.
6
+ */
7
+
8
+ import * as fs from 'node:fs/promises';
9
+ import * as path from 'node:path';
10
+ import { homedir } from 'node:os';
11
+
12
+ function getAuditFilePath(): string {
13
+ return process.env.MEMORIX_AUDIT_FILE || path.join(homedir(), '.memorix', 'audit.json');
14
+ }
15
+
16
+ export interface AuditEntry {
17
+ type: 'hook' | 'rule' | 'other';
18
+ agent?: string;
19
+ path: string;
20
+ createdAt: string;
21
+ }
22
+
23
+ export interface ProjectAudit {
24
+ projectRoot: string;
25
+ installedAt: string;
26
+ entries: AuditEntry[];
27
+ }
28
+
29
+ export interface AuditData {
30
+ version: string;
31
+ projects: Record<string, ProjectAudit>;
32
+ }
33
+
34
+ /**
35
+ * Load audit data from disk.
36
+ */
37
+ export async function loadAudit(): Promise<AuditData> {
38
+ try {
39
+ const content = await fs.readFile(getAuditFilePath(), 'utf-8');
40
+ return JSON.parse(content) as AuditData;
41
+ } catch {
42
+ // No audit file yet
43
+ return {
44
+ version: '1.0.0',
45
+ projects: {},
46
+ };
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Save audit data to disk.
52
+ */
53
+ export async function saveAudit(data: AuditData): Promise<void> {
54
+ const auditFile = getAuditFilePath();
55
+ const dir = path.dirname(auditFile);
56
+ await fs.mkdir(dir, { recursive: true });
57
+ await fs.writeFile(auditFile, JSON.stringify(data, null, 2), 'utf-8');
58
+ }
59
+
60
+ /**
61
+ * Get project ID from project root via .git detection.
62
+ */
63
+ export function getProjectId(projectRoot: string): string {
64
+ try {
65
+ const { detectProject } = require('../project/detector.js');
66
+ const project = detectProject(projectRoot);
67
+ if (project) return project.id;
68
+ } catch { /* fallback below */ }
69
+ const normalized = projectRoot.replace(/\\/g, '/');
70
+ return `untracked/${normalized}`;
71
+ }
72
+
73
+ /**
74
+ * Record a file written by Memorix.
75
+ */
76
+ export async function recordFile(
77
+ projectRoot: string,
78
+ type: AuditEntry['type'],
79
+ filePath: string,
80
+ agent?: string,
81
+ ): Promise<void> {
82
+ const data = await loadAudit();
83
+ const projectId = getProjectId(projectRoot);
84
+
85
+ if (!data.projects[projectId]) {
86
+ data.projects[projectId] = {
87
+ projectRoot,
88
+ installedAt: new Date().toISOString(),
89
+ entries: [],
90
+ };
91
+ }
92
+
93
+ // Check if entry already exists
94
+ const existingIndex = data.projects[projectId].entries.findIndex(
95
+ (e) => e.path === filePath
96
+ );
97
+
98
+ if (existingIndex === -1) {
99
+ data.projects[projectId].entries.push({
100
+ type,
101
+ agent,
102
+ path: filePath,
103
+ createdAt: new Date().toISOString(),
104
+ });
105
+ }
106
+
107
+ await saveAudit(data);
108
+ }
109
+
110
+ /**
111
+ * Get all files written by Memorix for a project.
112
+ */
113
+ export async function getProjectFiles(projectRoot: string): Promise<AuditEntry[]> {
114
+ const data = await loadAudit();
115
+ const projectId = getProjectId(projectRoot);
116
+ return data.projects[projectId]?.entries || [];
117
+ }
118
+
119
+ /**
120
+ * Remove a file from audit (when uninstalled).
121
+ */
122
+ export async function removeFile(projectRoot: string, filePath: string): Promise<void> {
123
+ const data = await loadAudit();
124
+ const projectId = getProjectId(projectRoot);
125
+
126
+ if (!data.projects[projectId]) return;
127
+
128
+ data.projects[projectId].entries = data.projects[projectId].entries.filter(
129
+ (e) => e.path !== filePath
130
+ );
131
+
132
+ // If no entries left, remove the project
133
+ if (data.projects[projectId].entries.length === 0) {
134
+ delete data.projects[projectId];
135
+ }
136
+
137
+ await saveAudit(data);
138
+ }
139
+
140
+ /**
141
+ * Get all audit entries across all projects.
142
+ */
143
+ export async function getAllAuditEntries(): Promise<
144
+ Array<{ projectId: string; entry: AuditEntry }>
145
+ > {
146
+ const data = await loadAudit();
147
+ const entries: Array<{ projectId: string; entry: AuditEntry }> = [];
148
+
149
+ for (const [projectId, project] of Object.entries(data.projects)) {
150
+ for (const entry of project.entries) {
151
+ entries.push({ projectId, entry });
152
+ }
153
+ }
154
+
155
+ return entries;
156
+ }