memorix 1.2.1 → 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 +16 -0
- package/README.md +14 -2
- package/README.zh-CN.md +14 -2
- package/TEAM.md +86 -86
- package/dist/cli/index.js +15407 -13779
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +1321 -529
- package/dist/index.js.map +1 -1
- package/dist/maintenance-runner.d.ts +1 -1
- package/dist/maintenance-runner.js +8458 -8087
- package/dist/maintenance-runner.js.map +1 -1
- package/dist/memcode-runtime/CHANGELOG.md +16 -0
- package/dist/sdk.d.ts +7 -2
- package/dist/sdk.js +1349 -535
- 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 +24 -4
- package/docs/DESIGN_DECISIONS.md +357 -357
- package/docs/README.md +1 -1
- package/docs/dev-log/progress.txt +91 -11
- 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 +15 -5
- 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/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 +8 -2
- package/src/cli/commands/serve-shared.ts +118 -118
- package/src/cli/commands/session.ts +29 -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 +31 -2
- package/src/codegraph/context-pack.ts +1 -0
- package/src/codegraph/project-context.ts +2 -0
- 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 +46 -9
- 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/context-assembly.ts +97 -0
- 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/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.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/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 +260 -81
- 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
|
@@ -1,131 +1,131 @@
|
|
|
1
|
-
import matter from 'gray-matter';
|
|
2
|
-
import type { AgentTarget, WorkflowEntry } from '../types.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* WorkflowSyncer — converts workflows between agent formats.
|
|
6
|
-
*
|
|
7
|
-
* Supported conversions:
|
|
8
|
-
* Windsurf .windsurf/workflows/*.md → Codex SKILL.md
|
|
9
|
-
* Windsurf .windsurf/workflows/*.md → Cursor .cursor/rules/*.mdc
|
|
10
|
-
* Windsurf .windsurf/workflows/*.md → Claude Code CLAUDE.md section
|
|
11
|
-
*/
|
|
12
|
-
export class WorkflowSyncer {
|
|
13
|
-
/**
|
|
14
|
-
* Parse a Windsurf workflow markdown file into a WorkflowEntry.
|
|
15
|
-
*/
|
|
16
|
-
parseWindsurfWorkflow(fileName: string, raw: string): WorkflowEntry {
|
|
17
|
-
const name = fileName.replace(/\.md$/i, '');
|
|
18
|
-
let description = '';
|
|
19
|
-
let content = raw;
|
|
20
|
-
|
|
21
|
-
try {
|
|
22
|
-
const parsed = matter(raw);
|
|
23
|
-
description = parsed.data?.description ?? '';
|
|
24
|
-
content = parsed.content.trim();
|
|
25
|
-
} catch {
|
|
26
|
-
// No frontmatter — use raw content
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
return {
|
|
30
|
-
name,
|
|
31
|
-
description,
|
|
32
|
-
content,
|
|
33
|
-
source: 'windsurf',
|
|
34
|
-
filePath: `.windsurf/workflows/${fileName}`,
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
/**
|
|
39
|
-
* Convert a workflow to Codex SKILL.md format.
|
|
40
|
-
*/
|
|
41
|
-
toCodexSkill(wf: WorkflowEntry): { filePath: string; content: string } {
|
|
42
|
-
const safeName = this.sanitizeName(wf.name);
|
|
43
|
-
const fm: Record<string, string> = { name: safeName };
|
|
44
|
-
if (wf.description) {
|
|
45
|
-
fm.description = wf.description;
|
|
46
|
-
}
|
|
47
|
-
const content = matter.stringify(wf.content, fm);
|
|
48
|
-
return {
|
|
49
|
-
filePath: `.agents/skills/${safeName}/SKILL.md`,
|
|
50
|
-
content,
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
/**
|
|
55
|
-
* Convert a workflow to Cursor .mdc rule format.
|
|
56
|
-
*/
|
|
57
|
-
toCursorRule(wf: WorkflowEntry): { filePath: string; content: string } {
|
|
58
|
-
const safeName = this.sanitizeName(wf.name);
|
|
59
|
-
const fm: Record<string, string> = {};
|
|
60
|
-
if (wf.description) {
|
|
61
|
-
fm.description = wf.description;
|
|
62
|
-
}
|
|
63
|
-
fm.globs = '';
|
|
64
|
-
fm.alwaysApply = 'false';
|
|
65
|
-
const content = matter.stringify(wf.content, fm);
|
|
66
|
-
return {
|
|
67
|
-
filePath: `.cursor/rules/${safeName}.mdc`,
|
|
68
|
-
content,
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* Convert a workflow to a CLAUDE.md section string.
|
|
74
|
-
*/
|
|
75
|
-
toClaudeSection(wf: WorkflowEntry): string {
|
|
76
|
-
const lines: string[] = [];
|
|
77
|
-
lines.push(`## Workflow: ${wf.name}`);
|
|
78
|
-
if (wf.description) {
|
|
79
|
-
lines.push('');
|
|
80
|
-
lines.push(`> ${wf.description}`);
|
|
81
|
-
}
|
|
82
|
-
lines.push('');
|
|
83
|
-
lines.push(wf.content);
|
|
84
|
-
return lines.join('\n');
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Convert all workflows to the target agent format.
|
|
89
|
-
* Returns an array of { filePath, content } for each generated file.
|
|
90
|
-
*/
|
|
91
|
-
convertAll(
|
|
92
|
-
workflows: WorkflowEntry[],
|
|
93
|
-
target: AgentTarget,
|
|
94
|
-
): { filePath: string; content: string }[] {
|
|
95
|
-
if (target === 'windsurf') {
|
|
96
|
-
// No conversion needed — already in Windsurf format
|
|
97
|
-
return [];
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
if (target === 'codex') {
|
|
101
|
-
return workflows.map((wf) => this.toCodexSkill(wf));
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
if (target === 'cursor') {
|
|
105
|
-
return workflows.map((wf) => this.toCursorRule(wf));
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (target === 'claude-code') {
|
|
109
|
-
// Merge all workflows into a single CLAUDE.md
|
|
110
|
-
const sections = workflows.map((wf) => this.toClaudeSection(wf));
|
|
111
|
-
return [
|
|
112
|
-
{
|
|
113
|
-
filePath: 'CLAUDE.md',
|
|
114
|
-
content: sections.join('\n\n'),
|
|
115
|
-
},
|
|
116
|
-
];
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return [];
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// ---- Helpers ----
|
|
123
|
-
|
|
124
|
-
private sanitizeName(name: string): string {
|
|
125
|
-
return name
|
|
126
|
-
.replace(/[^a-zA-Z0-9_-]/g, '-')
|
|
127
|
-
.replace(/-+/g, '-')
|
|
128
|
-
.replace(/^-|-$/g, '')
|
|
129
|
-
|| 'workflow';
|
|
130
|
-
}
|
|
131
|
-
}
|
|
1
|
+
import matter from 'gray-matter';
|
|
2
|
+
import type { AgentTarget, WorkflowEntry } from '../types.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* WorkflowSyncer — converts workflows between agent formats.
|
|
6
|
+
*
|
|
7
|
+
* Supported conversions:
|
|
8
|
+
* Windsurf .windsurf/workflows/*.md → Codex SKILL.md
|
|
9
|
+
* Windsurf .windsurf/workflows/*.md → Cursor .cursor/rules/*.mdc
|
|
10
|
+
* Windsurf .windsurf/workflows/*.md → Claude Code CLAUDE.md section
|
|
11
|
+
*/
|
|
12
|
+
export class WorkflowSyncer {
|
|
13
|
+
/**
|
|
14
|
+
* Parse a Windsurf workflow markdown file into a WorkflowEntry.
|
|
15
|
+
*/
|
|
16
|
+
parseWindsurfWorkflow(fileName: string, raw: string): WorkflowEntry {
|
|
17
|
+
const name = fileName.replace(/\.md$/i, '');
|
|
18
|
+
let description = '';
|
|
19
|
+
let content = raw;
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
const parsed = matter(raw);
|
|
23
|
+
description = parsed.data?.description ?? '';
|
|
24
|
+
content = parsed.content.trim();
|
|
25
|
+
} catch {
|
|
26
|
+
// No frontmatter — use raw content
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
name,
|
|
31
|
+
description,
|
|
32
|
+
content,
|
|
33
|
+
source: 'windsurf',
|
|
34
|
+
filePath: `.windsurf/workflows/${fileName}`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Convert a workflow to Codex SKILL.md format.
|
|
40
|
+
*/
|
|
41
|
+
toCodexSkill(wf: WorkflowEntry): { filePath: string; content: string } {
|
|
42
|
+
const safeName = this.sanitizeName(wf.name);
|
|
43
|
+
const fm: Record<string, string> = { name: safeName };
|
|
44
|
+
if (wf.description) {
|
|
45
|
+
fm.description = wf.description;
|
|
46
|
+
}
|
|
47
|
+
const content = matter.stringify(wf.content, fm);
|
|
48
|
+
return {
|
|
49
|
+
filePath: `.agents/skills/${safeName}/SKILL.md`,
|
|
50
|
+
content,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Convert a workflow to Cursor .mdc rule format.
|
|
56
|
+
*/
|
|
57
|
+
toCursorRule(wf: WorkflowEntry): { filePath: string; content: string } {
|
|
58
|
+
const safeName = this.sanitizeName(wf.name);
|
|
59
|
+
const fm: Record<string, string> = {};
|
|
60
|
+
if (wf.description) {
|
|
61
|
+
fm.description = wf.description;
|
|
62
|
+
}
|
|
63
|
+
fm.globs = '';
|
|
64
|
+
fm.alwaysApply = 'false';
|
|
65
|
+
const content = matter.stringify(wf.content, fm);
|
|
66
|
+
return {
|
|
67
|
+
filePath: `.cursor/rules/${safeName}.mdc`,
|
|
68
|
+
content,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Convert a workflow to a CLAUDE.md section string.
|
|
74
|
+
*/
|
|
75
|
+
toClaudeSection(wf: WorkflowEntry): string {
|
|
76
|
+
const lines: string[] = [];
|
|
77
|
+
lines.push(`## Workflow: ${wf.name}`);
|
|
78
|
+
if (wf.description) {
|
|
79
|
+
lines.push('');
|
|
80
|
+
lines.push(`> ${wf.description}`);
|
|
81
|
+
}
|
|
82
|
+
lines.push('');
|
|
83
|
+
lines.push(wf.content);
|
|
84
|
+
return lines.join('\n');
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Convert all workflows to the target agent format.
|
|
89
|
+
* Returns an array of { filePath, content } for each generated file.
|
|
90
|
+
*/
|
|
91
|
+
convertAll(
|
|
92
|
+
workflows: WorkflowEntry[],
|
|
93
|
+
target: AgentTarget,
|
|
94
|
+
): { filePath: string; content: string }[] {
|
|
95
|
+
if (target === 'windsurf') {
|
|
96
|
+
// No conversion needed — already in Windsurf format
|
|
97
|
+
return [];
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (target === 'codex') {
|
|
101
|
+
return workflows.map((wf) => this.toCodexSkill(wf));
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (target === 'cursor') {
|
|
105
|
+
return workflows.map((wf) => this.toCursorRule(wf));
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (target === 'claude-code') {
|
|
109
|
+
// Merge all workflows into a single CLAUDE.md
|
|
110
|
+
const sections = workflows.map((wf) => this.toClaudeSection(wf));
|
|
111
|
+
return [
|
|
112
|
+
{
|
|
113
|
+
filePath: 'CLAUDE.md',
|
|
114
|
+
content: sections.join('\n\n'),
|
|
115
|
+
},
|
|
116
|
+
];
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// ---- Helpers ----
|
|
123
|
+
|
|
124
|
+
private sanitizeName(name: string): string {
|
|
125
|
+
return name
|
|
126
|
+
.replace(/[^a-zA-Z0-9_-]/g, '-')
|
|
127
|
+
.replace(/-+/g, '-')
|
|
128
|
+
.replace(/^-|-$/g, '')
|
|
129
|
+
|| 'workflow';
|
|
130
|
+
}
|
|
131
|
+
}
|