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
@@ -0,0 +1,192 @@
1
+ export interface CliCommandGuide {
2
+ summary: string;
3
+ usage: string[];
4
+ notes?: string[];
5
+ }
6
+
7
+ const GUIDES: Record<string, CliCommandGuide> = {
8
+ memory: {
9
+ summary: 'Store, search, inspect, resolve, consolidate, and promote project memory.',
10
+ usage: [
11
+ 'memorix memory search --query "timeout regression" [--limit 10]',
12
+ 'memorix memory store --text "..." [--title "..."] [--visibility project|personal|team]',
13
+ 'memorix memory detail --id 42',
14
+ 'memorix memory recent [--limit 10]',
15
+ 'memorix memory resolve --ids 42,43 [--status resolved|archived]',
16
+ 'memorix memory consolidate --action preview|execute',
17
+ 'memorix memory promote --ids 42,43 [--trigger "..."] [--instruction "..."]',
18
+ ],
19
+ notes: ['Personal and team visibility require `memorix identity join` or `memorix identity use` first.'],
20
+ },
21
+ identity: {
22
+ summary: 'Select the active local actor for private memory and coordination commands.',
23
+ usage: [
24
+ 'memorix identity status',
25
+ 'memorix identity join --agent-type codex [--name codex-main --instance-id local]',
26
+ 'memorix identity use --agent-id <id>',
27
+ 'memorix identity clear',
28
+ ],
29
+ notes: ['Without an identity, CLI reads and writes only project-visible memory.'],
30
+ },
31
+ session: {
32
+ summary: 'Start, end, and inspect coding sessions. Coordination remains opt-in.',
33
+ usage: [
34
+ 'memorix session start --agent codex',
35
+ 'memorix session start --agent codex --agent-type codex --join-team --use',
36
+ 'memorix session end --session-id <id> [--summary "..."]',
37
+ 'memorix session context [--limit 3]',
38
+ ],
39
+ },
40
+ context: {
41
+ summary: 'Build the bounded task Workset used to resume or begin real work.',
42
+ usage: ['memorix context --task "continue the release fix" [--refresh auto|always|never]'],
43
+ },
44
+ explain: {
45
+ summary: 'Show why a task context contains its current facts and memory evidence.',
46
+ usage: ['memorix explain [--refresh auto|always|never]'],
47
+ },
48
+ codegraph: {
49
+ summary: 'Refresh local code-state snapshots and assemble task-specific code context.',
50
+ usage: [
51
+ 'memorix codegraph status',
52
+ 'memorix codegraph refresh',
53
+ 'memorix codegraph context-pack --task "trace the auth flow" [--limit 20]',
54
+ ],
55
+ },
56
+ knowledge: {
57
+ summary: 'Manage the reviewed, source-backed Knowledge Workspace and project workflows.',
58
+ usage: [
59
+ 'memorix knowledge init [--mode local|versioned]',
60
+ 'memorix knowledge status',
61
+ 'memorix knowledge compile',
62
+ 'memorix knowledge lint',
63
+ 'memorix knowledge workflow list',
64
+ ],
65
+ },
66
+ reasoning: {
67
+ summary: 'Capture and retrieve engineering decision rationale.',
68
+ usage: [
69
+ 'memorix reasoning store --entity auth --decision "Use SQLite" --rationale "..."',
70
+ 'memorix reasoning search --query "why sqlite" [--scope project|global]',
71
+ ],
72
+ },
73
+ retention: {
74
+ summary: 'Inspect retention state and archive records that are eligible under the current scope.',
75
+ usage: [
76
+ 'memorix retention status',
77
+ 'memorix retention stale',
78
+ 'memorix retention archive',
79
+ ],
80
+ },
81
+ transfer: {
82
+ summary: 'Create or restore explicit project memory snapshots for backup and automation.',
83
+ usage: [
84
+ 'memorix transfer export --format json --out ./.memorix-export.json',
85
+ 'memorix transfer import --file ./.memorix-export.json',
86
+ 'memorix transfer import --stdin',
87
+ ],
88
+ },
89
+ team: {
90
+ summary: 'Manage explicit multi-agent coordination state for the current project.',
91
+ usage: [
92
+ 'memorix team join --agent-type codex [--name codex-main]',
93
+ 'memorix team status [--all]',
94
+ 'memorix team leave [--agent-id <id>]',
95
+ ],
96
+ },
97
+ task: {
98
+ summary: 'Create and progress coordination tasks. An active CLI identity fills agentId automatically.',
99
+ usage: [
100
+ 'memorix task create --description "Review release evidence"',
101
+ 'memorix task claim --task-id <id>',
102
+ 'memorix task complete --task-id <id> --result "Verified"',
103
+ 'memorix task list [--available]',
104
+ ],
105
+ },
106
+ message: {
107
+ summary: 'Send and read coordination messages. An active CLI identity fills the sender automatically.',
108
+ usage: [
109
+ 'memorix message send --to <agent-id> --type info --content "..."',
110
+ 'memorix message broadcast --type announcement --content "..."',
111
+ 'memorix message inbox [--mark-read]',
112
+ ],
113
+ },
114
+ lock: {
115
+ summary: 'Use advisory file locks to reduce overlapping edits between agents.',
116
+ usage: [
117
+ 'memorix lock lock --file src/server.ts',
118
+ 'memorix lock unlock --file src/server.ts',
119
+ 'memorix lock status [--file src/server.ts]',
120
+ ],
121
+ },
122
+ handoff: {
123
+ summary: 'Create durable, targeted or team-visible handoff artifacts.',
124
+ usage: ['memorix handoff send --summary "..." --context "..." [--to-agent-id <id>]'],
125
+ },
126
+ poll: {
127
+ summary: 'Return a compact coordination snapshot for the active CLI identity.',
128
+ usage: ['memorix poll [--mark-inbox-read]'],
129
+ },
130
+ audit: {
131
+ summary: 'Inspect quality, attribution, and recorded audit evidence.',
132
+ usage: ['memorix audit memory', 'memorix audit project [--threshold 2]', 'memorix audit list'],
133
+ },
134
+ skills: {
135
+ summary: 'Inspect and generate project skills from project-visible memory evidence.',
136
+ usage: ['memorix skills list', 'memorix skills generate [--write --target codex]', 'memorix skills show --name <skill>'],
137
+ },
138
+ sync: {
139
+ summary: 'Synchronize agent rules and workspace artifacts through explicit routes.',
140
+ usage: ['memorix sync rules --action status', 'memorix sync workspace --action scan'],
141
+ },
142
+ ingest: {
143
+ summary: 'Ingest Git and image evidence into project memory.',
144
+ usage: ['memorix ingest commit [--ref HEAD]', 'memorix ingest log [--count 10]', 'memorix ingest image --path ./diagram.png'],
145
+ },
146
+ workbench: {
147
+ summary: 'Open the interactive terminal memory control plane.',
148
+ usage: ['memorix workbench'],
149
+ },
150
+ };
151
+
152
+ export function commandGuideNames(): string[] {
153
+ return Object.keys(GUIDES).sort();
154
+ }
155
+
156
+ export function renderCliGuide(command?: string): string {
157
+ const normalized = command?.trim().toLowerCase();
158
+ if (normalized && GUIDES[normalized]) {
159
+ const guide = GUIDES[normalized];
160
+ return [
161
+ `Memorix ${normalized}`,
162
+ '',
163
+ guide.summary,
164
+ '',
165
+ 'Usage:',
166
+ ...guide.usage.map((line) => ` ${line}`),
167
+ ...(guide.notes?.length ? ['', ...guide.notes.map((line) => `Note: ${line}`)] : []),
168
+ '',
169
+ 'Project/actor options: --cwd <git-project> --as <active-agent-id>. Operator commands accept --json.',
170
+ ].join('\n');
171
+ }
172
+
173
+ return [
174
+ 'Memorix CLI',
175
+ '',
176
+ 'Use `memorix <command> --help` for an action-oriented guide.',
177
+ '',
178
+ `Command groups: ${commandGuideNames().join(', ')}`,
179
+ '',
180
+ 'Global options: --cwd <git-project> --as <active-agent-id>',
181
+ 'Compatibility: camelCase flags remain supported; kebab-case flags are accepted too.',
182
+ ].join('\n');
183
+ }
184
+
185
+ /** Render manual action help before Citty consumes `--help` as flag metadata. */
186
+ export function printCliGuideForHelp(argv: string[] = process.argv.slice(2)): boolean {
187
+ const [command, ...rest] = argv;
188
+ if (!command || !GUIDES[command.toLowerCase()]) return false;
189
+ if (!rest.includes('--help') && !rest.includes('-h')) return false;
190
+ console.log(renderCliGuide(command));
191
+ return true;
192
+ }
@@ -1,89 +1,89 @@
1
- /**
2
- * CLI Command: memorix audit list
3
- *
4
- * List all files written by Memorix (audit trail).
5
- */
6
-
7
- import { defineCommand } from 'citty';
8
- import * as p from '@clack/prompts';
9
-
10
- export default defineCommand({
11
- meta: {
12
- name: 'list',
13
- description: 'List Memorix-written files (audit trail)',
14
- },
15
- args: {
16
- project: {
17
- type: 'string',
18
- description: 'Filter by project (optional)',
19
- required: false,
20
- },
21
- },
22
- run: async ({ args }) => {
23
- const { getAllAuditEntries, getProjectId } = await import('../../audit/index.js');
24
- const os = await import('node:os');
25
- let cwd: string;
26
- try {
27
- cwd = process.cwd();
28
- } catch {
29
- cwd = os.homedir();
30
- console.log(`[WARN] Could not access current directory, using home: ${cwd}`);
31
- }
32
-
33
- p.intro('Memorix Audit Trail');
34
-
35
- const allEntries = await getAllAuditEntries();
36
-
37
- if (allEntries.length === 0) {
38
- console.log('No Memorix-written files found.');
39
- p.outro('Audit trail is empty.');
40
- return;
41
- }
42
-
43
- // Filter by project if specified
44
- let entries = allEntries;
45
- if (args.project) {
46
- const targetProjectId = getProjectId(args.project);
47
- entries = allEntries.filter((e) => e.projectId === targetProjectId);
48
- }
49
-
50
- if (entries.length === 0) {
51
- console.log('No Memorix-written files found for this project.');
52
- p.outro('Audit trail is empty for this project.');
53
- return;
54
- }
55
-
56
- // Group by project
57
- const byProject: Record<string, Array<{ entry: import('../../audit/index.js').AuditEntry }>> = {};
58
- for (const { projectId, entry } of entries) {
59
- if (!byProject[projectId]) {
60
- byProject[projectId] = [];
61
- }
62
- byProject[projectId].push({ entry });
63
- }
64
-
65
- // Display by project
66
- console.log('');
67
- for (const [projectId, items] of Object.entries(byProject)) {
68
- console.log(`Project: ${projectId}`);
69
- console.log('');
70
-
71
- for (const { entry } of items) {
72
- const icon = entry.type === 'hook' ? '[HOOK]' : '[TASK]';
73
- const agent = entry.agent ? ` (${entry.agent})` : '';
74
- console.log(`${icon} ${entry.path}${agent}`);
75
- console.log(` Created: ${entry.createdAt}`);
76
- console.log('');
77
- }
78
- }
79
-
80
- // Summary
81
- const hookCount = entries.filter((e) => e.entry.type === 'hook').length;
82
- const ruleCount = entries.filter((e) => e.entry.type === 'rule').length;
83
- const projectCount = new Set(entries.map((e) => e.projectId)).size;
84
-
85
- p.note(`${projectCount} projects, ${hookCount} hooks, ${ruleCount} rules`);
86
-
87
- p.outro('Audit trail complete.');
88
- },
89
- });
1
+ /**
2
+ * CLI Command: memorix audit list
3
+ *
4
+ * List all files written by Memorix (audit trail).
5
+ */
6
+
7
+ import { defineCommand } from 'citty';
8
+ import * as p from '@clack/prompts';
9
+
10
+ export default defineCommand({
11
+ meta: {
12
+ name: 'list',
13
+ description: 'List Memorix-written files (audit trail)',
14
+ },
15
+ args: {
16
+ project: {
17
+ type: 'string',
18
+ description: 'Filter by project (optional)',
19
+ required: false,
20
+ },
21
+ },
22
+ run: async ({ args }) => {
23
+ const { getAllAuditEntries, getProjectId } = await import('../../audit/index.js');
24
+ const os = await import('node:os');
25
+ let cwd: string;
26
+ try {
27
+ cwd = process.cwd();
28
+ } catch {
29
+ cwd = os.homedir();
30
+ console.log(`[WARN] Could not access current directory, using home: ${cwd}`);
31
+ }
32
+
33
+ p.intro('Memorix Audit Trail');
34
+
35
+ const allEntries = await getAllAuditEntries();
36
+
37
+ if (allEntries.length === 0) {
38
+ console.log('No Memorix-written files found.');
39
+ p.outro('Audit trail is empty.');
40
+ return;
41
+ }
42
+
43
+ // Filter by project if specified
44
+ let entries = allEntries;
45
+ if (args.project) {
46
+ const targetProjectId = getProjectId(args.project);
47
+ entries = allEntries.filter((e) => e.projectId === targetProjectId);
48
+ }
49
+
50
+ if (entries.length === 0) {
51
+ console.log('No Memorix-written files found for this project.');
52
+ p.outro('Audit trail is empty for this project.');
53
+ return;
54
+ }
55
+
56
+ // Group by project
57
+ const byProject: Record<string, Array<{ entry: import('../../audit/index.js').AuditEntry }>> = {};
58
+ for (const { projectId, entry } of entries) {
59
+ if (!byProject[projectId]) {
60
+ byProject[projectId] = [];
61
+ }
62
+ byProject[projectId].push({ entry });
63
+ }
64
+
65
+ // Display by project
66
+ console.log('');
67
+ for (const [projectId, items] of Object.entries(byProject)) {
68
+ console.log(`Project: ${projectId}`);
69
+ console.log('');
70
+
71
+ for (const { entry } of items) {
72
+ const icon = entry.type === 'hook' ? '[HOOK]' : '[TASK]';
73
+ const agent = entry.agent ? ` (${entry.agent})` : '';
74
+ console.log(`${icon} ${entry.path}${agent}`);
75
+ console.log(` Created: ${entry.createdAt}`);
76
+ console.log('');
77
+ }
78
+ }
79
+
80
+ // Summary
81
+ const hookCount = entries.filter((e) => e.entry.type === 'hook').length;
82
+ const ruleCount = entries.filter((e) => e.entry.type === 'rule').length;
83
+ const projectCount = new Set(entries.map((e) => e.projectId)).size;
84
+
85
+ p.note(`${projectCount} projects, ${hookCount} hooks, ${ruleCount} rules`);
86
+
87
+ p.outro('Audit trail complete.');
88
+ },
89
+ });
@@ -3,6 +3,7 @@ import { getAllAuditEntries, getProjectId } from '../../audit/index.js';
3
3
  import { auditProjectObservations } from '../../memory/attribution-guard.js';
4
4
  import { getAllObservations } from '../../memory/observations.js';
5
5
  import { auditMemoryQuality } from '../../memory/quality-audit.js';
6
+ import { filterReadableObservations } from '../../memory/visibility.js';
6
7
  import { emitError, emitResult, getCliProjectContext } from './operator-shared.js';
7
8
 
8
9
  export default defineCommand({
@@ -22,8 +23,8 @@ export default defineCommand({
22
23
  try {
23
24
  switch (action) {
24
25
  case 'memory': {
25
- const { project } = await getCliProjectContext();
26
- const report = auditMemoryQuality(getAllObservations(), {
26
+ const { project, reader } = await getCliProjectContext();
27
+ const report = auditMemoryQuality(filterReadableObservations(getAllObservations(), reader), {
27
28
  projectId: project.id,
28
29
  });
29
30
  emitResult(
@@ -68,9 +69,13 @@ export default defineCommand({
68
69
  }
69
70
 
70
71
  case 'project': {
71
- const { project } = await getCliProjectContext();
72
+ const { project, reader } = await getCliProjectContext();
72
73
  const threshold = Number.parseInt(String(args.threshold ?? '2'), 10) || 2;
73
- const entries = await auditProjectObservations(project.id, getAllObservations(), threshold);
74
+ const entries = await auditProjectObservations(
75
+ project.id,
76
+ filterReadableObservations(getAllObservations(), reader),
77
+ threshold,
78
+ );
74
79
  emitResult(
75
80
  { project, entries, threshold },
76
81
  entries.length === 0