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.
- package/CHANGELOG.md +30 -1
- package/README.md +18 -4
- package/README.zh-CN.md +18 -4
- package/TEAM.md +86 -86
- package/dist/cli/index.js +15919 -14055
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +1997 -1021
- package/dist/index.js.map +1 -1
- package/dist/maintenance-runner.d.ts +1 -1
- package/dist/maintenance-runner.js +8481 -8005
- package/dist/maintenance-runner.js.map +1 -1
- package/dist/memcode-runtime/CHANGELOG.md +30 -1
- package/dist/sdk.d.ts +7 -2
- package/dist/sdk.js +2022 -1024
- package/dist/sdk.js.map +1 -1
- package/dist/types.d.ts +49 -1
- package/dist/types.js.map +1 -1
- package/docs/1.2.2-MEMORY-CONTROL-PLANE.md +434 -0
- package/docs/AGENT_OPERATOR_PLAYBOOK.md +4 -0
- package/docs/API_REFERENCE.md +27 -5
- package/docs/DESIGN_DECISIONS.md +357 -357
- package/docs/DEVELOPMENT.md +4 -0
- package/docs/README.md +1 -1
- package/docs/SETUP.md +7 -1
- package/docs/dev-log/progress.txt +91 -11
- package/docs/knowledge/workflows/memorix-release.md +57 -0
- package/package.json +1 -1
- package/plugins/codex/memorix/.codex-plugin/plugin.json +1 -1
- package/src/audit/index.ts +156 -156
- package/src/cli/command-guide.ts +192 -0
- package/src/cli/commands/audit-list.ts +89 -89
- package/src/cli/commands/audit.ts +9 -4
- package/src/cli/commands/background.ts +659 -659
- package/src/cli/commands/cleanup.ts +5 -1
- package/src/cli/commands/codegraph.ts +17 -8
- package/src/cli/commands/context.ts +3 -2
- package/src/cli/commands/doctor.ts +4 -2
- package/src/cli/commands/explain.ts +9 -3
- package/src/cli/commands/formation.ts +48 -48
- package/src/cli/commands/git-hook-install.ts +111 -111
- package/src/cli/commands/handoff.ts +75 -61
- package/src/cli/commands/hooks-status.ts +63 -63
- package/src/cli/commands/identity.ts +116 -0
- package/src/cli/commands/ingest-commit.ts +153 -153
- package/src/cli/commands/ingest-image.ts +71 -69
- package/src/cli/commands/ingest-log.ts +180 -180
- package/src/cli/commands/ingest.ts +44 -44
- package/src/cli/commands/integrate-shared.ts +15 -15
- package/src/cli/commands/knowledge.ts +40 -0
- package/src/cli/commands/lock.ts +93 -92
- package/src/cli/commands/memory.ts +58 -21
- package/src/cli/commands/message.ts +123 -118
- package/src/cli/commands/operator-shared.ts +98 -3
- package/src/cli/commands/poll.ts +74 -64
- package/src/cli/commands/purge-all-memory.ts +85 -85
- package/src/cli/commands/purge-project-memory.ts +83 -83
- package/src/cli/commands/reasoning.ts +135 -121
- package/src/cli/commands/retention.ts +9 -4
- package/src/cli/commands/serve-http.ts +22 -43
- package/src/cli/commands/serve-shared.ts +118 -118
- package/src/cli/commands/session.ts +29 -3
- package/src/cli/commands/setup.ts +9 -3
- package/src/cli/commands/skills.ts +124 -119
- package/src/cli/commands/status.ts +4 -3
- package/src/cli/commands/task.ts +193 -184
- package/src/cli/commands/team.ts +14 -10
- package/src/cli/commands/transfer.ts +108 -55
- package/src/cli/commands/uninstall-project-artifacts.ts +85 -85
- package/src/cli/identity.ts +89 -0
- package/src/cli/index.ts +96 -19
- package/src/cli/invocation.ts +115 -0
- package/src/cli/tui/ChatView.tsx +234 -234
- package/src/cli/tui/CommandBar.tsx +312 -312
- package/src/cli/tui/ContextRail.tsx +118 -118
- package/src/cli/tui/HeaderBar.tsx +72 -72
- package/src/cli/tui/LogoBanner.tsx +51 -51
- package/src/cli/tui/Sidebar.tsx +179 -179
- package/src/cli/tui/chat-service.ts +41 -18
- package/src/cli/tui/data.ts +23 -44
- package/src/cli/tui/index.ts +41 -41
- package/src/cli/tui/markdown-render.tsx +371 -371
- package/src/cli/tui/operator-context.ts +60 -0
- package/src/cli/tui/use-mouse.ts +157 -157
- package/src/cli/tui/useNavigation.ts +56 -56
- package/src/cli/tui/views/MemoryView.tsx +10 -8
- package/src/cli/update-checker.ts +211 -211
- package/src/cli/version.ts +7 -7
- package/src/cli/workbench.ts +1 -1
- package/src/codegraph/auto-context.ts +34 -17
- package/src/codegraph/context-pack.ts +1 -0
- package/src/codegraph/current-facts.ts +19 -1
- package/src/codegraph/project-context.ts +2 -0
- package/src/codegraph/task-lens.ts +49 -5
- package/src/compact/engine.ts +26 -10
- package/src/compact/index-format.ts +25 -2
- package/src/compact/token-budget.ts +74 -74
- package/src/dashboard/project-classification.ts +64 -64
- package/src/dashboard/server.ts +58 -52
- package/src/embedding/fastembed-provider.ts +142 -142
- package/src/embedding/transformers-provider.ts +111 -111
- package/src/git/extractor.ts +209 -209
- package/src/git/hooks-path.ts +85 -85
- package/src/hooks/admission.ts +117 -0
- package/src/hooks/handler.ts +98 -91
- package/src/hooks/pattern-detector.ts +173 -173
- package/src/hooks/significance-filter.ts +250 -250
- package/src/knowledge/claims.ts +51 -1
- package/src/knowledge/context-assembly.ts +97 -0
- package/src/knowledge/types.ts +1 -0
- package/src/knowledge/workflows.ts +34 -3
- package/src/knowledge/workset.ts +179 -10
- package/src/llm/memory-manager.ts +328 -328
- package/src/llm/provider.ts +885 -885
- package/src/llm/quality.ts +248 -248
- package/src/memory/admission.ts +57 -0
- package/src/memory/attribution-guard.ts +249 -249
- package/src/memory/auto-relations.ts +21 -0
- package/src/memory/consolidation.ts +13 -2
- package/src/memory/disclosure-policy.ts +140 -135
- package/src/memory/entity-extractor.ts +197 -197
- package/src/memory/export-import.ts +11 -3
- package/src/memory/formation/evaluate.ts +217 -217
- package/src/memory/formation/extract.ts +361 -361
- package/src/memory/formation/index.ts +417 -417
- package/src/memory/formation/resolve.ts +344 -344
- package/src/memory/formation/types.ts +315 -315
- package/src/memory/freshness.ts +122 -122
- package/src/memory/graph-context.ts +8 -2
- package/src/memory/graph-scope.ts +46 -0
- package/src/memory/graph.ts +197 -197
- package/src/memory/observations.ts +162 -4
- package/src/memory/quality-audit.ts +2 -0
- package/src/memory/refs.ts +94 -94
- package/src/memory/retention.ts +22 -2
- package/src/memory/secret-filter.ts +79 -79
- package/src/memory/session.ts +5 -2
- package/src/memory/visibility.ts +80 -0
- package/src/multimodal/image-loader.ts +143 -143
- package/src/orchestrate/adapters/claude-stream.ts +192 -192
- package/src/orchestrate/adapters/claude.ts +111 -111
- package/src/orchestrate/adapters/codex-stream.ts +134 -134
- package/src/orchestrate/adapters/codex.ts +41 -41
- package/src/orchestrate/adapters/gemini-stream.ts +166 -166
- package/src/orchestrate/adapters/gemini.ts +42 -42
- package/src/orchestrate/adapters/index.ts +73 -73
- package/src/orchestrate/adapters/opencode-stream.ts +143 -143
- package/src/orchestrate/adapters/opencode.ts +47 -47
- package/src/orchestrate/adapters/spawn-helper.ts +286 -286
- package/src/orchestrate/adapters/types.ts +77 -77
- package/src/orchestrate/capability-router.ts +284 -284
- package/src/orchestrate/context-compact.ts +188 -188
- package/src/orchestrate/cost-tracker.ts +219 -219
- package/src/orchestrate/error-recovery.ts +191 -191
- package/src/orchestrate/evidence.ts +140 -140
- package/src/orchestrate/ledger.ts +110 -110
- package/src/orchestrate/memorix-bridge.ts +378 -340
- package/src/orchestrate/output-budget.ts +80 -80
- package/src/orchestrate/permission.ts +152 -152
- package/src/orchestrate/pipeline-trace.ts +131 -131
- package/src/orchestrate/prompt-builder.ts +155 -155
- package/src/orchestrate/ring-buffer.ts +37 -37
- package/src/orchestrate/task-graph.ts +389 -389
- package/src/orchestrate/verify-gate.ts +33 -10
- package/src/orchestrate/worktree.ts +232 -232
- package/src/project/aliases.ts +374 -374
- package/src/project/detector.ts +268 -268
- package/src/rules/adapters/claude-code.ts +99 -99
- package/src/rules/adapters/codex.ts +97 -97
- package/src/rules/adapters/copilot.ts +124 -124
- package/src/rules/adapters/cursor.ts +114 -114
- package/src/rules/adapters/kiro.ts +126 -126
- package/src/rules/adapters/trae.ts +56 -56
- package/src/rules/adapters/windsurf.ts +83 -83
- package/src/rules/syncer.ts +235 -235
- package/src/runtime/control-plane-maintenance.ts +1 -0
- package/src/runtime/isolated-maintenance.ts +1 -0
- package/src/runtime/lifecycle.ts +18 -0
- package/src/runtime/maintenance-jobs.ts +1 -0
- package/src/runtime/maintenance-runner.ts +2 -0
- package/src/runtime/project-maintenance.ts +89 -0
- package/src/sdk.ts +334 -304
- package/src/search/intent-detector.ts +289 -289
- package/src/search/query-expansion.ts +52 -52
- package/src/server/formation-timeout.ts +27 -27
- package/src/server.ts +334 -93
- package/src/skills/mini-skills.ts +386 -386
- package/src/store/chat-store.ts +119 -119
- package/src/store/graph-store.ts +249 -249
- package/src/store/mini-skill-store.ts +349 -349
- package/src/store/orama-store.ts +61 -6
- package/src/store/persistence-json.ts +212 -212
- package/src/store/persistence.ts +291 -291
- package/src/store/project-affinity.ts +195 -195
- package/src/store/sqlite-db.ts +23 -1
- package/src/store/sqlite-store.ts +12 -2
- package/src/team/event-bus.ts +76 -76
- package/src/team/file-locks.ts +173 -173
- package/src/team/handoff.ts +168 -161
- package/src/team/messages.ts +203 -203
- package/src/team/poll.ts +132 -132
- package/src/team/tasks.ts +211 -211
- package/src/types.ts +51 -0
- package/src/wiki/generator.ts +2 -0
- package/src/workspace/mcp-adapters/codex.ts +191 -191
- package/src/workspace/mcp-adapters/copilot.ts +105 -105
- package/src/workspace/mcp-adapters/cursor.ts +53 -53
- package/src/workspace/mcp-adapters/kiro.ts +64 -64
- package/src/workspace/mcp-adapters/opencode.ts +123 -123
- package/src/workspace/mcp-adapters/trae.ts +134 -134
- package/src/workspace/mcp-adapters/windsurf.ts +91 -91
- package/src/workspace/sanitizer.ts +60 -60
- package/src/workspace/workflow-sync.ts +131 -131
package/docs/DEVELOPMENT.md
CHANGED
|
@@ -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
|
|
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
|
|
8
|
-
- Branch: `codex/1.2.
|
|
9
|
-
- Last updated: 2026-07-
|
|
10
|
-
- Released baseline: `memorix@1.1
|
|
11
|
-
`
|
|
12
|
-
- Goal:
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
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,
|
|
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
|
-
-
|
|
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
package/src/audit/index.ts
CHANGED
|
@@ -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
|
+
}
|