claude-memory-store 0.1.0
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/README.md +364 -0
- package/dist/acknowledgement.d.ts +14 -0
- package/dist/acknowledgement.d.ts.map +1 -0
- package/dist/acknowledgement.js +55 -0
- package/dist/acknowledgement.js.map +1 -0
- package/dist/atlas/client.d.ts +9 -0
- package/dist/atlas/client.d.ts.map +1 -0
- package/dist/atlas/client.js +64 -0
- package/dist/atlas/client.js.map +1 -0
- package/dist/atlas/embeddings.d.ts +18 -0
- package/dist/atlas/embeddings.d.ts.map +1 -0
- package/dist/atlas/embeddings.js +56 -0
- package/dist/atlas/embeddings.js.map +1 -0
- package/dist/atlas/indexes.d.ts +4 -0
- package/dist/atlas/indexes.d.ts.map +1 -0
- package/dist/atlas/indexes.js +78 -0
- package/dist/atlas/indexes.js.map +1 -0
- package/dist/atlas/vector.d.ts +17 -0
- package/dist/atlas/vector.d.ts.map +1 -0
- package/dist/atlas/vector.js +61 -0
- package/dist/atlas/vector.js.map +1 -0
- package/dist/bin/claude-memory.d.ts +3 -0
- package/dist/bin/claude-memory.d.ts.map +1 -0
- package/dist/bin/claude-memory.js +648 -0
- package/dist/bin/claude-memory.js.map +1 -0
- package/dist/bin/mcp-server.d.ts +3 -0
- package/dist/bin/mcp-server.d.ts.map +1 -0
- package/dist/bin/mcp-server.js +165 -0
- package/dist/bin/mcp-server.js.map +1 -0
- package/dist/cache/command-cache.d.ts +12 -0
- package/dist/cache/command-cache.d.ts.map +1 -0
- package/dist/cache/command-cache.js +63 -0
- package/dist/cache/command-cache.js.map +1 -0
- package/dist/cleanup.d.ts +8 -0
- package/dist/cleanup.d.ts.map +1 -0
- package/dist/cleanup.js +22 -0
- package/dist/cleanup.js.map +1 -0
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +97 -0
- package/dist/config.js.map +1 -0
- package/dist/detector.d.ts +20 -0
- package/dist/detector.d.ts.map +1 -0
- package/dist/detector.js +92 -0
- package/dist/detector.js.map +1 -0
- package/dist/editor/file-editor.d.ts +7 -0
- package/dist/editor/file-editor.d.ts.map +1 -0
- package/dist/editor/file-editor.js +73 -0
- package/dist/editor/file-editor.js.map +1 -0
- package/dist/editor/tui.d.ts +11 -0
- package/dist/editor/tui.d.ts.map +1 -0
- package/dist/editor/tui.js +75 -0
- package/dist/editor/tui.js.map +1 -0
- package/dist/hooks/post-tool-use.d.ts +11 -0
- package/dist/hooks/post-tool-use.d.ts.map +1 -0
- package/dist/hooks/post-tool-use.js +36 -0
- package/dist/hooks/post-tool-use.js.map +1 -0
- package/dist/hooks/pre-tool-use.d.ts +5 -0
- package/dist/hooks/pre-tool-use.d.ts.map +1 -0
- package/dist/hooks/pre-tool-use.js +103 -0
- package/dist/hooks/pre-tool-use.js.map +1 -0
- package/dist/hooks/startup.d.ts +25 -0
- package/dist/hooks/startup.d.ts.map +1 -0
- package/dist/hooks/startup.js +62 -0
- package/dist/hooks/startup.js.map +1 -0
- package/dist/hooks/stop.d.ts +39 -0
- package/dist/hooks/stop.d.ts.map +1 -0
- package/dist/hooks/stop.js +102 -0
- package/dist/hooks/stop.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +166 -0
- package/dist/index.js.map +1 -0
- package/dist/memory/commands.d.ts +15 -0
- package/dist/memory/commands.d.ts.map +1 -0
- package/dist/memory/commands.js +55 -0
- package/dist/memory/commands.js.map +1 -0
- package/dist/memory/developer.d.ts +17 -0
- package/dist/memory/developer.d.ts.map +1 -0
- package/dist/memory/developer.js +233 -0
- package/dist/memory/developer.js.map +1 -0
- package/dist/memory/project.d.ts +25 -0
- package/dist/memory/project.d.ts.map +1 -0
- package/dist/memory/project.js +341 -0
- package/dist/memory/project.js.map +1 -0
- package/dist/memory/threads.d.ts +10 -0
- package/dist/memory/threads.d.ts.map +1 -0
- package/dist/memory/threads.js +57 -0
- package/dist/memory/threads.js.map +1 -0
- package/dist/memory/working.d.ts +16 -0
- package/dist/memory/working.d.ts.map +1 -0
- package/dist/memory/working.js +80 -0
- package/dist/memory/working.js.map +1 -0
- package/dist/natural-language/intent.d.ts +4 -0
- package/dist/natural-language/intent.d.ts.map +1 -0
- package/dist/natural-language/intent.js +169 -0
- package/dist/natural-language/intent.js.map +1 -0
- package/dist/natural-language/parser.d.ts +5 -0
- package/dist/natural-language/parser.d.ts.map +1 -0
- package/dist/natural-language/parser.js +63 -0
- package/dist/natural-language/parser.js.map +1 -0
- package/dist/natural-language/router.d.ts +9 -0
- package/dist/natural-language/router.d.ts.map +1 -0
- package/dist/natural-language/router.js +171 -0
- package/dist/natural-language/router.js.map +1 -0
- package/dist/project-id.d.ts +5 -0
- package/dist/project-id.d.ts.map +1 -0
- package/dist/project-id.js +78 -0
- package/dist/project-id.js.map +1 -0
- package/dist/slash-commands/edit.d.ts +10 -0
- package/dist/slash-commands/edit.d.ts.map +1 -0
- package/dist/slash-commands/edit.js +312 -0
- package/dist/slash-commands/edit.js.map +1 -0
- package/dist/slash-commands/memory.d.ts +3 -0
- package/dist/slash-commands/memory.d.ts.map +1 -0
- package/dist/slash-commands/memory.js +69 -0
- package/dist/slash-commands/memory.js.map +1 -0
- package/dist/slash-commands/recall.d.ts +2 -0
- package/dist/slash-commands/recall.d.ts.map +1 -0
- package/dist/slash-commands/recall.js +81 -0
- package/dist/slash-commands/recall.js.map +1 -0
- package/dist/slash-commands/remember.d.ts +2 -0
- package/dist/slash-commands/remember.d.ts.map +1 -0
- package/dist/slash-commands/remember.js +21 -0
- package/dist/slash-commands/remember.js.map +1 -0
- package/dist/slash-commands/stats.d.ts +2 -0
- package/dist/slash-commands/stats.d.ts.map +1 -0
- package/dist/slash-commands/stats.js +55 -0
- package/dist/slash-commands/stats.js.map +1 -0
- package/dist/slash-commands/threads.d.ts +4 -0
- package/dist/slash-commands/threads.d.ts.map +1 -0
- package/dist/slash-commands/threads.js +36 -0
- package/dist/slash-commands/threads.js.map +1 -0
- package/dist/startup/conversation.d.ts +17 -0
- package/dist/startup/conversation.d.ts.map +1 -0
- package/dist/startup/conversation.js +78 -0
- package/dist/startup/conversation.js.map +1 -0
- package/dist/startup/feature-search.d.ts +9 -0
- package/dist/startup/feature-search.d.ts.map +1 -0
- package/dist/startup/feature-search.js +62 -0
- package/dist/startup/feature-search.js.map +1 -0
- package/dist/startup/injector.d.ts +4 -0
- package/dist/startup/injector.d.ts.map +1 -0
- package/dist/startup/injector.js +190 -0
- package/dist/startup/injector.js.map +1 -0
- package/dist/summarizer.d.ts +15 -0
- package/dist/summarizer.d.ts.map +1 -0
- package/dist/summarizer.js +92 -0
- package/dist/summarizer.js.map +1 -0
- package/dist/types.d.ts +151 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +5 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +16 -0
- package/dist/utils.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.d.ts","sourceRoot":"","sources":["../../src/bin/mcp-server.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
/**
|
|
5
|
+
* MCP Server for Claude Memory Store
|
|
6
|
+
*
|
|
7
|
+
* Exposes memory operations as MCP tools that Claude can call directly:
|
|
8
|
+
* - recall(topic) — search memory for relevant context
|
|
9
|
+
* - remember(text) — store a decision, pattern, or rule
|
|
10
|
+
* - memory_threads() — list open threads
|
|
11
|
+
* - memory_stats() — show memory statistics
|
|
12
|
+
*/
|
|
13
|
+
const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
|
|
14
|
+
const stdio_js_1 = require("@modelcontextprotocol/sdk/server/stdio.js");
|
|
15
|
+
const zod_1 = require("zod");
|
|
16
|
+
const client_js_1 = require("../atlas/client.js");
|
|
17
|
+
const config_js_1 = require("../config.js");
|
|
18
|
+
const vector_js_1 = require("../atlas/vector.js");
|
|
19
|
+
const project_id_js_1 = require("../project-id.js");
|
|
20
|
+
const project_js_1 = require("../memory/project.js");
|
|
21
|
+
const developer_js_1 = require("../memory/developer.js");
|
|
22
|
+
const working_js_1 = require("../memory/working.js");
|
|
23
|
+
const server = new mcp_js_1.McpServer({
|
|
24
|
+
name: 'claude-memory',
|
|
25
|
+
version: '0.1.0',
|
|
26
|
+
});
|
|
27
|
+
let connected = false;
|
|
28
|
+
async function ensureConnected() {
|
|
29
|
+
if (connected)
|
|
30
|
+
return;
|
|
31
|
+
const uri = (0, config_js_1.getAtlasUri)();
|
|
32
|
+
if (!uri)
|
|
33
|
+
throw new Error('No Atlas URI configured. Run claude-memory init.');
|
|
34
|
+
await (0, client_js_1.connect)(uri);
|
|
35
|
+
connected = true;
|
|
36
|
+
}
|
|
37
|
+
// ─── Tool: recall ───────────────────────────────────────────────────────────
|
|
38
|
+
server.tool('recall', 'Search persistent memory for decisions, patterns, commands, or context about a topic. Use this before starting work on a feature area, or when the developer asks about project conventions.', { topic: zod_1.z.string().describe('Topic to search memory for'), limit: zod_1.z.number().int().min(1).max(20).default(5).describe('Max results to return') }, async ({ topic, limit }) => {
|
|
39
|
+
await ensureConnected();
|
|
40
|
+
const projectId = (0, project_id_js_1.getProjectId)();
|
|
41
|
+
const results = await (0, vector_js_1.search)(topic, projectId, limit);
|
|
42
|
+
if (results.length === 0) {
|
|
43
|
+
return {
|
|
44
|
+
content: [{ type: 'text', text: `No memory found for "${topic}".` }],
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
const formatted = results
|
|
48
|
+
.map((r) => `[${r.type}] ${r.content}`)
|
|
49
|
+
.join('\n\n');
|
|
50
|
+
return {
|
|
51
|
+
content: [{ type: 'text', text: `=== MEMORY RECALL: ${topic} ===\n\n${formatted}` }],
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
// ─── Tool: remember ─────────────────────────────────────────────────────────
|
|
55
|
+
server.tool('remember', 'Store an important decision, pattern, convention, or rule to persistent memory. Automatically classifies: "never/avoid" → avoid rule, "always use/pattern" → pattern, "architecture/database" → architecture decision, "across all projects" → developer preference.', { text: zod_1.z.string().describe('The decision, pattern, or rule to remember'), category: zod_1.z.enum(['auto', 'architecture', 'pattern', 'avoid', 'preference']).default('auto').describe('Category (auto-detects if not specified)') }, async ({ text, category }) => {
|
|
56
|
+
await ensureConnected();
|
|
57
|
+
await (0, project_js_1.ensureProjectMeta)();
|
|
58
|
+
let actualCategory = category;
|
|
59
|
+
if (actualCategory === 'auto') {
|
|
60
|
+
const lower = text.toLowerCase();
|
|
61
|
+
if (/\b(never|don't|do not|avoid|stop)\b/.test(lower)) {
|
|
62
|
+
actualCategory = 'avoid';
|
|
63
|
+
}
|
|
64
|
+
else if (/\b(always use|pattern|convention|approach)\b/.test(lower)) {
|
|
65
|
+
actualCategory = 'pattern';
|
|
66
|
+
}
|
|
67
|
+
else if (/\b(architecture|design|structure|database|schema|stack)\b/.test(lower)) {
|
|
68
|
+
actualCategory = 'architecture';
|
|
69
|
+
}
|
|
70
|
+
else if (/\b(across all projects|every project|all repos)\b/.test(lower)) {
|
|
71
|
+
actualCategory = 'preference';
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
actualCategory = 'architecture'; // default
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
switch (actualCategory) {
|
|
78
|
+
case 'architecture':
|
|
79
|
+
await (0, project_js_1.addArchitectureDecision)(text);
|
|
80
|
+
break;
|
|
81
|
+
case 'pattern':
|
|
82
|
+
await (0, project_js_1.addPattern)(text);
|
|
83
|
+
break;
|
|
84
|
+
case 'avoid':
|
|
85
|
+
await (0, project_js_1.addAvoid)(text);
|
|
86
|
+
break;
|
|
87
|
+
case 'preference':
|
|
88
|
+
await (0, developer_js_1.ensureDeveloperMeta)();
|
|
89
|
+
await (0, developer_js_1.addPreference)(text);
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
content: [{ type: 'text', text: `Stored to ${actualCategory}: "${text}"` }],
|
|
94
|
+
};
|
|
95
|
+
});
|
|
96
|
+
// ─── Tool: memory_threads ───────────────────────────────────────────────────
|
|
97
|
+
server.tool('memory_threads', 'List all open threads — unresolved issues, deferred tasks, and items being watched. Threads persist across sessions and surface when relevant context is detected.', {}, async () => {
|
|
98
|
+
await ensureConnected();
|
|
99
|
+
const threads = await (0, project_js_1.getOpenThreads)();
|
|
100
|
+
if (threads.length === 0) {
|
|
101
|
+
return {
|
|
102
|
+
content: [{ type: 'text', text: 'No open threads.' }],
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
const formatted = threads
|
|
106
|
+
.map((t, i) => {
|
|
107
|
+
const age = Math.floor((Date.now() - new Date(t.created).getTime()) / 86400000);
|
|
108
|
+
return `[${i + 1}] ${t.description} (${t.status}, ${age}d ago)\n ${t.context || 'No context'}`;
|
|
109
|
+
})
|
|
110
|
+
.join('\n\n');
|
|
111
|
+
return {
|
|
112
|
+
content: [{ type: 'text', text: `=== OPEN THREADS ===\n\n${formatted}` }],
|
|
113
|
+
};
|
|
114
|
+
});
|
|
115
|
+
// ─── Tool: memory_stats ─────────────────────────────────────────────────────
|
|
116
|
+
server.tool('memory_stats', 'Show memory statistics — counts of stored decisions, patterns, avoid rules, commands, threads, preferences, and session history.', {}, async () => {
|
|
117
|
+
await ensureConnected();
|
|
118
|
+
const [pm, dm, arch, patterns, avoid, threads, commands, prefs, styles, sessions] = await Promise.all([
|
|
119
|
+
(0, project_js_1.getProjectMeta)(),
|
|
120
|
+
(0, developer_js_1.getDeveloperMeta)(),
|
|
121
|
+
(0, project_js_1.getArchitectureDecisions)(),
|
|
122
|
+
(0, project_js_1.getPatterns)(),
|
|
123
|
+
(0, project_js_1.getAvoidRules)(),
|
|
124
|
+
(0, project_js_1.getOpenThreads)(),
|
|
125
|
+
(0, project_js_1.getAllCommands)(),
|
|
126
|
+
(0, developer_js_1.getPreferences)(),
|
|
127
|
+
(0, developer_js_1.getStyles)(),
|
|
128
|
+
(0, working_js_1.getRecentWorkingMemory)(100),
|
|
129
|
+
]);
|
|
130
|
+
const lines = [
|
|
131
|
+
`=== MEMORY STATS: ${(0, project_id_js_1.getProjectName)()} ===`,
|
|
132
|
+
'',
|
|
133
|
+
`Project: ${pm?.project_name || 'unknown'}`,
|
|
134
|
+
`Sessions: ${pm?.total_sessions || 0} | Cost: $${(pm?.total_cost_usd || 0).toFixed(2)}`,
|
|
135
|
+
'',
|
|
136
|
+
'Project Memory:',
|
|
137
|
+
` Architecture decisions: ${arch.length}`,
|
|
138
|
+
` Patterns: ${patterns.length}`,
|
|
139
|
+
` Avoid rules: ${avoid.length}`,
|
|
140
|
+
` Open threads: ${threads.length}`,
|
|
141
|
+
` Verified commands: ${Object.keys(commands).length}`,
|
|
142
|
+
'',
|
|
143
|
+
'Developer Memory:',
|
|
144
|
+
` Preferences: ${prefs.length}`,
|
|
145
|
+
` Style rules: ${styles.length}`,
|
|
146
|
+
` Total sessions (all projects): ${dm?.session_count || 0}`,
|
|
147
|
+
'',
|
|
148
|
+
`Working memory: ${sessions.length} session(s) stored`,
|
|
149
|
+
];
|
|
150
|
+
return {
|
|
151
|
+
content: [{ type: 'text', text: lines.join('\n') }],
|
|
152
|
+
};
|
|
153
|
+
});
|
|
154
|
+
// ─── Start Server ───────────────────────────────────────────────────────────
|
|
155
|
+
async function main() {
|
|
156
|
+
const transport = new stdio_js_1.StdioServerTransport();
|
|
157
|
+
await server.connect(transport);
|
|
158
|
+
// Log to stderr — stdout is reserved for MCP protocol
|
|
159
|
+
console.error('[claude-memory-mcp] Server running on stdio');
|
|
160
|
+
}
|
|
161
|
+
main().catch((error) => {
|
|
162
|
+
console.error('[claude-memory-mcp] Fatal error:', error);
|
|
163
|
+
process.exit(1);
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=mcp-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server.js","sourceRoot":"","sources":["../../src/bin/mcp-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { VerifiedCommand } from '../types.js';
|
|
2
|
+
export declare class CommandCache {
|
|
3
|
+
private commands;
|
|
4
|
+
private triggerMap;
|
|
5
|
+
load(commands: Record<string, VerifiedCommand>): void;
|
|
6
|
+
match(prompt: string): VerifiedCommand | null;
|
|
7
|
+
update(trigger: string, command: VerifiedCommand): void;
|
|
8
|
+
remove(trigger: string): void;
|
|
9
|
+
getAll(): Record<string, VerifiedCommand>;
|
|
10
|
+
private normalize;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=command-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-cache.d.ts","sourceRoot":"","sources":["../../src/cache/command-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAA2C;IAC3D,OAAO,CAAC,UAAU,CAAkC;IAEpD,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI;IAcrD,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAmB7C,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAQvD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAW7B,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;IAQzC,OAAO,CAAC,SAAS;CAGlB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CommandCache = void 0;
|
|
4
|
+
class CommandCache {
|
|
5
|
+
commands = new Map();
|
|
6
|
+
triggerMap = new Map();
|
|
7
|
+
load(commands) {
|
|
8
|
+
this.commands.clear();
|
|
9
|
+
this.triggerMap.clear();
|
|
10
|
+
for (const [trigger, cmd] of Object.entries(commands)) {
|
|
11
|
+
this.commands.set(trigger, cmd);
|
|
12
|
+
// Map all trigger words to the primary trigger
|
|
13
|
+
this.triggerMap.set(this.normalize(trigger), trigger);
|
|
14
|
+
for (const t of cmd.triggers) {
|
|
15
|
+
this.triggerMap.set(this.normalize(t), trigger);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
match(prompt) {
|
|
20
|
+
const normalized = this.normalize(prompt);
|
|
21
|
+
// Direct trigger match
|
|
22
|
+
const directKey = this.triggerMap.get(normalized);
|
|
23
|
+
if (directKey) {
|
|
24
|
+
return this.commands.get(directKey) || null;
|
|
25
|
+
}
|
|
26
|
+
// Check if prompt contains a trigger word
|
|
27
|
+
for (const [trigger, primaryKey] of this.triggerMap.entries()) {
|
|
28
|
+
if (normalized.includes(trigger) || trigger.includes(normalized)) {
|
|
29
|
+
return this.commands.get(primaryKey) || null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
update(trigger, command) {
|
|
35
|
+
this.commands.set(trigger, command);
|
|
36
|
+
this.triggerMap.set(this.normalize(trigger), trigger);
|
|
37
|
+
for (const t of command.triggers) {
|
|
38
|
+
this.triggerMap.set(this.normalize(t), trigger);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
remove(trigger) {
|
|
42
|
+
const cmd = this.commands.get(trigger);
|
|
43
|
+
if (cmd) {
|
|
44
|
+
for (const t of cmd.triggers) {
|
|
45
|
+
this.triggerMap.delete(this.normalize(t));
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
this.commands.delete(trigger);
|
|
49
|
+
this.triggerMap.delete(this.normalize(trigger));
|
|
50
|
+
}
|
|
51
|
+
getAll() {
|
|
52
|
+
const result = {};
|
|
53
|
+
for (const [key, value] of this.commands.entries()) {
|
|
54
|
+
result[key] = value;
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
normalize(text) {
|
|
59
|
+
return text.toLowerCase().trim().replace(/[^a-z0-9\s]/g, '');
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.CommandCache = CommandCache;
|
|
63
|
+
//# sourceMappingURL=command-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-cache.js","sourceRoot":"","sources":["../../src/cache/command-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application-level TTL cleanup.
|
|
3
|
+
* Deletes documents where last_accessed is older than the configured TTL.
|
|
4
|
+
* project_meta and developer_meta are exempt (never expire).
|
|
5
|
+
* Runs on session startup — reads config each time for immediate effect.
|
|
6
|
+
*/
|
|
7
|
+
export declare function cleanupExpiredMemory(): Promise<number>;
|
|
8
|
+
//# sourceMappingURL=cleanup.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.d.ts","sourceRoot":"","sources":["../src/cleanup.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAY5D"}
|
package/dist/cleanup.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cleanupExpiredMemory = cleanupExpiredMemory;
|
|
4
|
+
const client_js_1 = require("./atlas/client.js");
|
|
5
|
+
const config_js_1 = require("./config.js");
|
|
6
|
+
/**
|
|
7
|
+
* Application-level TTL cleanup.
|
|
8
|
+
* Deletes documents where last_accessed is older than the configured TTL.
|
|
9
|
+
* project_meta and developer_meta are exempt (never expire).
|
|
10
|
+
* Runs on session startup — reads config each time for immediate effect.
|
|
11
|
+
*/
|
|
12
|
+
async function cleanupExpiredMemory() {
|
|
13
|
+
const ttlDays = (0, config_js_1.getMemoryTtlDays)();
|
|
14
|
+
const cutoff = new Date(Date.now() - ttlDays * 86400000);
|
|
15
|
+
const collection = await (0, client_js_1.getCollection)();
|
|
16
|
+
const result = await collection.deleteMany({
|
|
17
|
+
last_accessed: { $lt: cutoff },
|
|
18
|
+
type: { $nin: ['project_meta', 'developer_meta'] },
|
|
19
|
+
});
|
|
20
|
+
return result.deletedCount;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../src/cleanup.ts"],"names":[],"mappings":";;AASA,oDAYC;AArBD,iDAAkD;AAClD,2CAA+C;AAE/C;;;;;GAKG;AACI,KAAK,UAAU,oBAAoB;IACxC,MAAM,OAAO,GAAG,IAAA,4BAAgB,GAAE,CAAC;IACnC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,QAAQ,CAAC,CAAC;IAEzD,MAAM,UAAU,GAAG,MAAM,IAAA,yBAAa,GAAE,CAAC;IAEzC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC;QACzC,aAAa,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE;QAC9B,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,cAAc,EAAE,gBAAgB,CAAC,EAAE;KACnD,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ClaudeMemoryConfig } from './types.js';
|
|
2
|
+
export declare function getConfigDir(): string;
|
|
3
|
+
export declare function getConfigPath(): string;
|
|
4
|
+
export declare function ensureConfigDir(): void;
|
|
5
|
+
export declare function loadConfig(): ClaudeMemoryConfig;
|
|
6
|
+
export declare function saveConfig(config: ClaudeMemoryConfig): void;
|
|
7
|
+
export declare function getAtlasUri(): string;
|
|
8
|
+
export declare function isConfigured(): boolean;
|
|
9
|
+
export declare function getMemoryTtlDays(): number;
|
|
10
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAWrD,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAItC;AAED,wBAAgB,UAAU,IAAI,kBAAkB,CAW/C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAG3D;AAED,wBAAgB,WAAW,IAAI,MAAM,CAOpC;AAED,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAGzC"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getConfigDir = getConfigDir;
|
|
37
|
+
exports.getConfigPath = getConfigPath;
|
|
38
|
+
exports.ensureConfigDir = ensureConfigDir;
|
|
39
|
+
exports.loadConfig = loadConfig;
|
|
40
|
+
exports.saveConfig = saveConfig;
|
|
41
|
+
exports.getAtlasUri = getAtlasUri;
|
|
42
|
+
exports.isConfigured = isConfigured;
|
|
43
|
+
exports.getMemoryTtlDays = getMemoryTtlDays;
|
|
44
|
+
const fs = __importStar(require("node:fs"));
|
|
45
|
+
const path = __importStar(require("node:path"));
|
|
46
|
+
const os = __importStar(require("node:os"));
|
|
47
|
+
const CONFIG_DIR = path.join(os.homedir(), '.claude-memory');
|
|
48
|
+
const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
|
|
49
|
+
const DEFAULT_CONFIG = {
|
|
50
|
+
atlas_uri: '',
|
|
51
|
+
team_memory: false,
|
|
52
|
+
memory_ttl_days: 30,
|
|
53
|
+
};
|
|
54
|
+
function getConfigDir() {
|
|
55
|
+
return CONFIG_DIR;
|
|
56
|
+
}
|
|
57
|
+
function getConfigPath() {
|
|
58
|
+
return CONFIG_FILE;
|
|
59
|
+
}
|
|
60
|
+
function ensureConfigDir() {
|
|
61
|
+
if (!fs.existsSync(CONFIG_DIR)) {
|
|
62
|
+
fs.mkdirSync(CONFIG_DIR, { recursive: true });
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
function loadConfig() {
|
|
66
|
+
if (!fs.existsSync(CONFIG_FILE)) {
|
|
67
|
+
return { ...DEFAULT_CONFIG };
|
|
68
|
+
}
|
|
69
|
+
try {
|
|
70
|
+
const raw = fs.readFileSync(CONFIG_FILE, 'utf-8');
|
|
71
|
+
const parsed = JSON.parse(raw);
|
|
72
|
+
return { ...DEFAULT_CONFIG, ...parsed };
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
return { ...DEFAULT_CONFIG };
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
function saveConfig(config) {
|
|
79
|
+
ensureConfigDir();
|
|
80
|
+
fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf-8');
|
|
81
|
+
}
|
|
82
|
+
function getAtlasUri() {
|
|
83
|
+
// Priority: env var > config file
|
|
84
|
+
const envUri = process.env.CLAUDE_MEMORY_ATLAS_URI;
|
|
85
|
+
if (envUri)
|
|
86
|
+
return envUri;
|
|
87
|
+
const config = loadConfig();
|
|
88
|
+
return config.atlas_uri;
|
|
89
|
+
}
|
|
90
|
+
function isConfigured() {
|
|
91
|
+
return !!getAtlasUri();
|
|
92
|
+
}
|
|
93
|
+
function getMemoryTtlDays() {
|
|
94
|
+
const config = loadConfig();
|
|
95
|
+
return config.memory_ttl_days ?? 30;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,oCAEC;AAED,sCAEC;AAED,0CAIC;AAED,gCAWC;AAED,gCAGC;AAED,kCAOC;AAED,oCAEC;AAED,4CAGC;AA9DD,4CAA8B;AAC9B,gDAAkC;AAClC,4CAA8B;AAG9B,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,gBAAgB,CAAC,CAAC;AAC7D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,MAAM,cAAc,GAAuB;IACzC,SAAS,EAAE,EAAE;IACb,WAAW,EAAE,KAAK;IAClB,eAAe,EAAE,EAAE;CACpB,CAAC;AAEF,SAAgB,YAAY;IAC1B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAgB,aAAa;IAC3B,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,SAAgB,eAAe;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,SAAgB,UAAU;IACxB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,SAAgB,UAAU,CAAC,MAA0B;IACnD,eAAe,EAAE,CAAC;IAClB,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1E,CAAC;AAED,SAAgB,WAAW;IACzB,kCAAkC;IAClC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC;IACnD,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,SAAS,CAAC;AAC1B,CAAC;AAED,SAAgB,YAAY;IAC1B,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AACzB,CAAC;AAED,SAAgB,gBAAgB;IAC9B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,OAAO,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
interface PatternDetection {
|
|
2
|
+
description: string;
|
|
3
|
+
occurrences: number;
|
|
4
|
+
sessions: number;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Analyze working memory across sessions to detect recurring developer patterns.
|
|
8
|
+
* Runs after every 5 sessions.
|
|
9
|
+
*/
|
|
10
|
+
export declare function detectDeveloperPatterns(): Promise<PatternDetection[]>;
|
|
11
|
+
/**
|
|
12
|
+
* Check for contradictions between existing memory and new content.
|
|
13
|
+
*/
|
|
14
|
+
export declare function detectContradiction(existing: string[], newItem: string): {
|
|
15
|
+
isContradiction: boolean;
|
|
16
|
+
conflictsWith?: string;
|
|
17
|
+
};
|
|
18
|
+
export declare function formatContradiction(existing: string, newItem: string): string;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=detector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.d.ts","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"AAGA,UAAU,gBAAgB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAqC3E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE,MAAM,GACd;IAAE,eAAe,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CA4BtD;AAgBD,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAS7E"}
|
package/dist/detector.js
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.detectDeveloperPatterns = detectDeveloperPatterns;
|
|
4
|
+
exports.detectContradiction = detectContradiction;
|
|
5
|
+
exports.formatContradiction = formatContradiction;
|
|
6
|
+
const developer_js_1 = require("./memory/developer.js");
|
|
7
|
+
const working_js_1 = require("./memory/working.js");
|
|
8
|
+
/**
|
|
9
|
+
* Analyze working memory across sessions to detect recurring developer patterns.
|
|
10
|
+
* Runs after every 5 sessions.
|
|
11
|
+
*/
|
|
12
|
+
async function detectDeveloperPatterns() {
|
|
13
|
+
const dm = await (0, developer_js_1.getDeveloperMeta)();
|
|
14
|
+
if (!dm)
|
|
15
|
+
return [];
|
|
16
|
+
// Only run detection every 5 sessions
|
|
17
|
+
if (dm.session_count % 5 !== 0 || dm.session_count === 0)
|
|
18
|
+
return [];
|
|
19
|
+
const recentSessions = await (0, working_js_1.getRecentWorkingMemory)(10);
|
|
20
|
+
if (recentSessions.length < 5)
|
|
21
|
+
return [];
|
|
22
|
+
const patterns = [];
|
|
23
|
+
// Analyze searchable text for recurring themes
|
|
24
|
+
const allText = recentSessions.map((s) => s.searchable_text.toLowerCase());
|
|
25
|
+
// Look for repeated phrases/concepts across sessions
|
|
26
|
+
const wordFrequency = new Map();
|
|
27
|
+
for (const text of allText) {
|
|
28
|
+
const words = text.split(/\s+/).filter((w) => w.length > 4);
|
|
29
|
+
const uniqueWords = new Set(words);
|
|
30
|
+
for (const word of uniqueWords) {
|
|
31
|
+
wordFrequency.set(word, (wordFrequency.get(word) || 0) + 1);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
// Find words that appear in many sessions (potential patterns)
|
|
35
|
+
for (const [word, count] of wordFrequency) {
|
|
36
|
+
if (count >= Math.ceil(recentSessions.length * 0.6)) {
|
|
37
|
+
patterns.push({
|
|
38
|
+
description: `Recurring concept: "${word}"`,
|
|
39
|
+
occurrences: count,
|
|
40
|
+
sessions: recentSessions.length,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return patterns;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check for contradictions between existing memory and new content.
|
|
48
|
+
*/
|
|
49
|
+
function detectContradiction(existing, newItem) {
|
|
50
|
+
const newLower = newItem.toLowerCase();
|
|
51
|
+
for (const item of existing) {
|
|
52
|
+
const itemLower = item.toLowerCase();
|
|
53
|
+
// Simple negation detection
|
|
54
|
+
if ((newLower.includes('not ') && itemLower.includes(newLower.replace('not ', ''))) ||
|
|
55
|
+
(itemLower.includes('not ') && newLower.includes(itemLower.replace('not ', '')))) {
|
|
56
|
+
return { isContradiction: true, conflictsWith: item };
|
|
57
|
+
}
|
|
58
|
+
// "use X" vs "use Y" for same category
|
|
59
|
+
const newUseMatch = newLower.match(/use\s+(\w+)/);
|
|
60
|
+
const existingUseMatch = itemLower.match(/use\s+(\w+)/);
|
|
61
|
+
if (newUseMatch &&
|
|
62
|
+
existingUseMatch &&
|
|
63
|
+
newUseMatch[1] !== existingUseMatch[1] &&
|
|
64
|
+
hasSimilarContext(newLower, itemLower)) {
|
|
65
|
+
return { isContradiction: true, conflictsWith: item };
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return { isContradiction: false };
|
|
69
|
+
}
|
|
70
|
+
function hasSimilarContext(a, b) {
|
|
71
|
+
const aWords = new Set(a.split(/\s+/).filter((w) => w.length > 3));
|
|
72
|
+
const bWords = new Set(b.split(/\s+/).filter((w) => w.length > 3));
|
|
73
|
+
let overlap = 0;
|
|
74
|
+
for (const word of aWords) {
|
|
75
|
+
if (bWords.has(word))
|
|
76
|
+
overlap++;
|
|
77
|
+
}
|
|
78
|
+
// Consider similar if >30% word overlap
|
|
79
|
+
const minSize = Math.min(aWords.size, bWords.size);
|
|
80
|
+
return minSize > 0 && overlap / minSize > 0.3;
|
|
81
|
+
}
|
|
82
|
+
function formatContradiction(existing, newItem) {
|
|
83
|
+
return `MEMORY CONFLICT DETECTED
|
|
84
|
+
|
|
85
|
+
Existing: "${existing}"
|
|
86
|
+
New session: "${newItem}"
|
|
87
|
+
|
|
88
|
+
(r) Replace existing with new decision
|
|
89
|
+
(b) Keep both -- apply in different contexts
|
|
90
|
+
(s) Skip -- do not save`;
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../src/detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function getEditor(): string;
|
|
2
|
+
export declare function createTempFile(content: string, prefix?: string): string;
|
|
3
|
+
export declare function openInEditor(filePath: string): void;
|
|
4
|
+
export declare function readTempFile(filePath: string): string;
|
|
5
|
+
export declare function cleanupTempFile(filePath: string): void;
|
|
6
|
+
export declare function parseTempFile<T>(filePath: string): T;
|
|
7
|
+
//# sourceMappingURL=file-editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-editor.d.ts","sourceRoot":"","sources":["../../src/editor/file-editor.ts"],"names":[],"mappings":"AAKA,wBAAgB,SAAS,IAAI,MAAM,CAElC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,GAAE,MAAwB,GAAG,MAAM,CAIxF;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAGnD;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAMtD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,CAGpD"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.getEditor = getEditor;
|
|
37
|
+
exports.createTempFile = createTempFile;
|
|
38
|
+
exports.openInEditor = openInEditor;
|
|
39
|
+
exports.readTempFile = readTempFile;
|
|
40
|
+
exports.cleanupTempFile = cleanupTempFile;
|
|
41
|
+
exports.parseTempFile = parseTempFile;
|
|
42
|
+
const fs = __importStar(require("node:fs"));
|
|
43
|
+
const os = __importStar(require("node:os"));
|
|
44
|
+
const path = __importStar(require("node:path"));
|
|
45
|
+
const node_child_process_1 = require("node:child_process");
|
|
46
|
+
function getEditor() {
|
|
47
|
+
return process.env.EDITOR || process.env.VISUAL || 'nano';
|
|
48
|
+
}
|
|
49
|
+
function createTempFile(content, prefix = 'claude-memory') {
|
|
50
|
+
const tmpFile = path.join(os.tmpdir(), `${prefix}-${Date.now()}.json`);
|
|
51
|
+
fs.writeFileSync(tmpFile, content, 'utf-8');
|
|
52
|
+
return tmpFile;
|
|
53
|
+
}
|
|
54
|
+
function openInEditor(filePath) {
|
|
55
|
+
const editor = getEditor();
|
|
56
|
+
(0, node_child_process_1.execSync)(`${editor} "${filePath}"`, { stdio: 'inherit' });
|
|
57
|
+
}
|
|
58
|
+
function readTempFile(filePath) {
|
|
59
|
+
return fs.readFileSync(filePath, 'utf-8');
|
|
60
|
+
}
|
|
61
|
+
function cleanupTempFile(filePath) {
|
|
62
|
+
try {
|
|
63
|
+
fs.unlinkSync(filePath);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Best effort cleanup
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
function parseTempFile(filePath) {
|
|
70
|
+
const content = readTempFile(filePath);
|
|
71
|
+
return JSON.parse(content);
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=file-editor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-editor.js","sourceRoot":"","sources":["../../src/editor/file-editor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,8BAEC;AAED,wCAIC;AAED,oCAGC;AAED,oCAEC;AAED,0CAMC;AAED,sCAGC;AAnCD,4CAA8B;AAC9B,4CAA8B;AAC9B,gDAAkC;AAClC,2DAA8C;AAE9C,SAAgB,SAAS;IACvB,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,MAAM,CAAC;AAC5D,CAAC;AAED,SAAgB,cAAc,CAAC,OAAe,EAAE,SAAiB,eAAe;IAC9E,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACvE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,YAAY,CAAC,QAAgB;IAC3C,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAA,6BAAQ,EAAC,GAAG,MAAM,KAAK,QAAQ,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;AAC5D,CAAC;AAED,SAAgB,YAAY,CAAC,QAAgB;IAC3C,OAAO,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,eAAe,CAAC,QAAgB;IAC9C,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,sBAAsB;IACxB,CAAC;AACH,CAAC;AAED,SAAgB,aAAa,CAAI,QAAgB;IAC/C,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;AAClC,CAAC"}
|