memorix 1.2.2 → 1.2.3
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 +7 -0
- package/TEAM.md +86 -86
- package/dist/cli/index.js +34 -18
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +17 -8
- package/dist/index.js.map +1 -1
- package/dist/maintenance-runner.js.map +1 -1
- package/dist/memcode-runtime/CHANGELOG.md +7 -0
- package/dist/sdk.js +17 -8
- package/dist/sdk.js.map +1 -1
- package/docs/DESIGN_DECISIONS.md +357 -357
- package/docs/dev-log/progress.txt +18 -8
- 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/commands/audit-list.ts +89 -89
- package/src/cli/commands/background.ts +659 -659
- package/src/cli/commands/formation.ts +48 -48
- package/src/cli/commands/git-hook-install.ts +111 -111
- package/src/cli/commands/handoff.ts +54 -54
- package/src/cli/commands/hooks-status.ts +63 -63
- package/src/cli/commands/ingest-commit.ts +153 -153
- package/src/cli/commands/ingest-image.ts +66 -66
- 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 +82 -82
- package/src/cli/commands/message.ts +104 -104
- package/src/cli/commands/poll.ts +58 -58
- 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 +118 -118
- package/src/cli/commands/serve-shared.ts +118 -118
- package/src/cli/commands/session.ts +15 -7
- package/src/cli/commands/skills.ts +114 -114
- package/src/cli/commands/task.ts +167 -167
- package/src/cli/commands/transfer.ts +47 -47
- package/src/cli/commands/uninstall-project-artifacts.ts +85 -85
- 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/index.ts +41 -41
- package/src/cli/tui/markdown-render.tsx +371 -371
- package/src/cli/tui/session-service.ts +3 -2
- package/src/cli/tui/use-mouse.ts +157 -157
- package/src/cli/tui/useNavigation.ts +56 -56
- package/src/cli/update-checker.ts +211 -211
- package/src/cli/version.ts +7 -7
- package/src/cli/workbench.ts +1 -1
- package/src/compact/token-budget.ts +74 -74
- package/src/dashboard/project-classification.ts +64 -64
- 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/pattern-detector.ts +173 -173
- package/src/hooks/significance-filter.ts +250 -250
- 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/attribution-guard.ts +249 -249
- package/src/memory/disclosure-policy.ts +135 -135
- package/src/memory/entity-extractor.ts +197 -197
- 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.ts +197 -197
- package/src/memory/refs.ts +94 -94
- package/src/memory/secret-filter.ts +79 -79
- package/src/memory/session.ts +24 -9
- 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 +343 -343
- 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/sdk.ts +299 -299
- 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 +7 -2
- 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/persistence-json.ts +212 -212
- package/src/store/persistence.ts +291 -291
- package/src/store/project-affinity.ts +195 -195
- package/src/team/event-bus.ts +76 -76
- package/src/team/file-locks.ts +173 -173
- package/src/team/handoff.ts +161 -161
- package/src/team/messages.ts +203 -203
- package/src/team/poll.ts +132 -132
- package/src/team/tasks.ts +211 -211
- 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
|
+
}
|