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
|
@@ -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(
|
|
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
|